General

In this notebook the code for the publication “Schoen et al. 2023, Christensenella minuta boosts gut microbial biomass and voluntary physical activity in mice” for all analyses is provided.

Packages

if (!require("data.table")) install_packages("data.table")
Loading required package: data.table
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
data.table 1.14.2 using 40 threads (see ?getDTthreads).  Latest news: r-datatable.com
library(data.table)
if (!require("tidyverse")) install_packages("tidyverse")
Loading required package: tidyverse
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.1 ──
✓ ggplot2 3.3.5     ✓ purrr   0.3.4
✓ tibble  3.1.6     ✓ dplyr   1.0.8
✓ tidyr   1.2.0     ✓ stringr 1.4.0
✓ readr   2.1.2     ✓ forcats 0.5.1
── Conflicts ───────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
x dplyr::between()   masks data.table::between()
x dplyr::filter()    masks stats::filter()
x dplyr::first()     masks data.table::first()
x dplyr::lag()       masks stats::lag()
x dplyr::last()      masks data.table::last()
x dplyr::location()  masks switchr::location()
x purrr::transpose() masks data.table::transpose()
library(tidyverse)
if (!require("ggplot2")) install_packages("ggplot2")
library(ggplot2)
if (!require("ggthemes")) install_packages("ggthemes")
Loading required package: ggthemes
library(ggthemes)
if (!require("scales")) install_packages("scales")
Loading required package: scales

Attaching package: ‘scales’

The following object is masked from ‘package:purrr’:

    discard

The following object is masked from ‘package:readr’:

    col_factor
library(scales)
if (!require("ggforce")) install_packages("ggforce")
Loading required package: ggforce
library(ggforce)
if (!require("ggpubr")) install_packages("ggpubr")
Loading required package: ggpubr
library(ggpubr)
if (!require('lubridate')) install_packages('lubridate')
Loading required package: lubridate

Attaching package: ‘lubridate’

The following objects are masked from ‘package:data.table’:

    hour, isoweek, mday, minute, month, quarter, second, wday, week, yday, year

The following objects are masked from ‘package:base’:

    date, intersect, setdiff, union
library(lubridate)
if (!require('car')) install_packages('car')
Loading required package: car
Loading required package: carData

Attaching package: ‘car’

The following object is masked from ‘package:dplyr’:

    recode

The following object is masked from ‘package:purrr’:

    some
library(car)
if (!require('Rmisc')) install_packages('Rmisc')
Loading required package: Rmisc
Loading required package: lattice
Loading required package: plyr
-----------------------------------------------------------------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
-----------------------------------------------------------------------------------------------------------------------------------------

Attaching package: ‘plyr’

The following object is masked from ‘package:ggpubr’:

    mutate

The following objects are masked from ‘package:dplyr’:

    arrange, count, desc, failwith, id, mutate, rename, summarise, summarize

The following object is masked from ‘package:purrr’:

    compact
library(Rmisc)
if (!require('bestNormalize')) install_packages('bestNormalize')
Loading required package: bestNormalize
library(bestNormalize)
if (!require('PerformanceAnalytics')) install_packages('PerformanceAnalytics')
Loading required package: PerformanceAnalytics
Loading required package: xts
Loading required package: zoo

Attaching package: ‘zoo’

The following objects are masked from ‘package:base’:

    as.Date, as.Date.numeric


Attaching package: ‘xts’

The following objects are masked from ‘package:dplyr’:

    first, last

The following objects are masked from ‘package:data.table’:

    first, last


Attaching package: ‘PerformanceAnalytics’

The following object is masked from ‘package:graphics’:

    legend
library(PerformanceAnalytics)
if (!require('lmerTest')) install_packages('lmerTest')
Loading required package: lmerTest
Loading required package: lme4
Loading required package: Matrix

Attaching package: ‘Matrix’

The following objects are masked from ‘package:tidyr’:

    expand, pack, unpack


Attaching package: ‘lmerTest’

The following object is masked from ‘package:lme4’:

    lmer

The following object is masked from ‘package:stats’:

    step
library(lmerTest)
if (!require('reshape2')) install_packages('reshape2')
Loading required package: reshape2

Attaching package: ‘reshape2’

The following object is masked from ‘package:tidyr’:

    smiths

The following objects are masked from ‘package:data.table’:

    dcast, melt
library(reshape2)
if (!require('emmeans')) install_packages('emmeans')
Loading required package: emmeans
library(emmeans)
if (!require('Maaslin2')) install_packages('Maaslin2')
Loading required package: Maaslin2
library(Maaslin2)
if (!require("effects")) install.packages("effects")
Loading required package: effects
Use the command
    lattice::trellis.par.set(effectsTheme())
  to customize lattice options for effects plots.
See ?effectsTheme for details.
library(effects)
if (!require("vegan")) install.packages("vegan")
Loading required package: vegan
Loading required package: permute
This is vegan 2.5-7
library(vegan)
if (!require("patchwork")) install.packages("patchwork")
Loading required package: patchwork
library(patchwork)
if (!require("ggmap")) install_packages("ggmap")
Loading required package: ggmap
ℹ Google's Terms of Service: <https://mapsplatform.google.com>
ℹ Please cite ggmap if you use it! Use `citation("ggmap")` for details.
library(ggmap)
if (!require("maps")) install_packages("maps")
Loading required package: maps

Attaching package: ‘maps’

The following object is masked from ‘package:plyr’:

    ozone

The following object is masked from ‘package:purrr’:

    map
library(maps)
if (!require("mapdata")) install_packages("mapdata")
Loading required package: mapdata
library(mapdata)
if (!require("partR2")) remotes::install_github("mastoffel/partR2") 
Loading required package: partR2
library(partR2)
if (!require("rsq")) install_packages("rsq")
Loading required package: rsq
library(rsq)
if (!require("cowplot")) install_packages("cowplot")
Loading required package: cowplot

Attaching package: ‘cowplot’

The following object is masked from ‘package:ggmap’:

    theme_nothing

The following object is masked from ‘package:patchwork’:

    align_plots

The following object is masked from ‘package:lubridate’:

    stamp

The following object is masked from ‘package:ggpubr’:

    get_legend

The following object is masked from ‘package:ggthemes’:

    theme_map
library(cowplot)
if (!require("ggmap")) install_packages("ggmap")
library(ggmap)
if (!require("maps")) install_packages("maps")
library(maps)
if (!require("mapdata")) install_packages("mapdata")
library(mapdata)
if (!require("patchwork")) install_packages("patchwork")
library(patchwork)
if (!require("ggh4x")) install_packages("ggh4x")
Loading required package: ggh4x
library(ggh4x)
if (!require("ggbeeswarm")) install_packages("ggbeeswarm")
Loading required package: ggbeeswarm
library(ggbeeswarm)

Functions

backup_options <- options() #only run when restarting the session to save the default options
options(backup_options)
shape_Sex <- c(16, 4)
color_Category <- c("darkgoldenrod1", "darkblue")
color_HL <- c("sienna1", "deepskyblue")
color_distict <- c("#000000","#004949","#009292","#ff6db6","#ffb6db",
 "#490092","#006ddb","#b66dff","#6db6ff","#b6dbff",
 "#920000","#924900","#db6d00","#24ff24","#ffff6d")

properColnames=function(x){
   gsub(" ", "_", 
   gsub("-", "_", 
   gsub(":", "_", 
   gsub("\\+", "_", 
   gsub("\\.", "_",
   gsub("\\(", "", 
   gsub("\\)", "", 
   gsub("^\\d", "", names(x)))))))))
}

properNames = function(x){
   gsub(" ", "_", 
   gsub("-", "_", 
   gsub(":", "_", 
   gsub("\\+", "_",
   gsub("\\.", "_", 
   gsub("\\(", "", 
   gsub("\\)", "", 
   gsub("^\\d", "", x))))))))
}

Set working directory

setwd(dir = "XXXX")

Data

# Christensenellacae global human studies
Figure_globe_data <- fread("./data/FigureS1/map_data.txt") %>% dplyr::arrange(-Sample_size_of_cohort)

# metadata including murine data, body composition measurements, weekly weight measurement, spilled food and feces in respirometry cages, bomb calorimetry mesurements, and qPCR mesurements
metadata <- fread("./data/Metadata/Mouse_metadata.txt") 
Metadata_exclude_id <- c(6296,6305,6374,6372, #sick
                         6350,6426,6451, 6455) #died
metadata <- metadata %>% dplyr::filter(!str_detect(MouseID, paste(Metadata_exclude_id, collapse="|")))
#Promethion
Promethion <- fread("./data/Promethion/Promethion_data_raw.txt")
Circadian <- fread("./data/Promethion/Promethion_data_circadian.txt")

# Metabolomics
## LCMS
### untargeted
LCMS_xcms_output <- fread("./data/Metabolomics/LCMS_serum_untargeted_XCMS.diffreport.MultiClass.tsv")
### targeted
LCMS_serum <- fread("./data/Metabolomics/LCMS_trargeted_serum_area.csv") 
## GC-MS: SCFA
GCMS_SCFAs <- fread("./data/Metabolomics/GCMS_SCFAs.txt") 

# Metagenomics
## qPCR
qPCR_data <- fread("./data/Metagenomics/qPCR_data.txt") 
## Shotgun Sequencing
Metagenomics_metadata_CC <- fread("./data/Metagenomics/Metagenomics_metadata_CC.txt") 

Metagenomics_exclude_id <- c("6296", "6305", "6350", "6374", "6372", "6426", "6451", "6455" # sick anmals
                                , "6434", "6420") #low DNA extraction yield --> low qPCR signal --> normalization not possible
Bracken_otu_table_relFreq <- fread("./data/Metagenomics/Bracken_otu_table_relFreq.txt") # with Donor
Bracken_otu_table_reads <- fread("./data/Metagenomics/Bracken_otu_table_reads.txt") # without Donor

General modification of data

Promethion time series recordings

start_date <- as.Date("2020-05-01") #defining common starting date for all recordings

Promethion.2 <- Promethion %>%
  dplyr::filter(!str_detect(MouseID, paste(Metadata_exclude_id, collapse="|"))) %>%
  dplyr::mutate(Date = as.POSIXct(trunc(as.POSIXct(DateTime), units = "hours"))) %>%
  dplyr::group_by(MouseID) %>%
  dplyr::mutate(difference_start_date = round(as.numeric(difftime(as.Date(min(DateTime), format = "%Y%m%d"), start_date, units = "day"))), 
                Date_common = Date - lubridate::days(difference_start_date)) %>% # create a date-column with a common starting date
  dplyr::ungroup() %>%
  dplyr::left_join(metadata, by = c("MouseID", "Batch", "Promethion_Position"))

Promethion circadian recordings

Circadian.2 <- Circadian %>%
  dplyr::filter(!str_detect(MouseID, paste(Metadata_exclude_id, collapse="|"))) %>%
  dplyr::mutate(StartDate = as.POSIXct(StartDate)) %>%
  dplyr::group_by(MouseID) %>%
  dplyr::mutate(difference_start_date = round(as.numeric(difftime(as.Date(min(StartDate), format = "%Y%m%d"), start_date, units = "day"))), 
                StartDate_common = StartDate - lubridate::days(difference_start_date)) %>% # create a date-column with a common starting date
  dplyr::ungroup() %>% 
  dplyr::filter(StartDate_common != "2020-05-04", 
                StartDate_common != "2020-05-01") # exclude acclimatization and take down

Analysis

Sorted by paragraphs of results ## Figure S1 - Global map of studies associating the gut bacterial family Christensenellaceae with healthy body mass index and/or metabolic health in human gut microbiome studies.

FigureS1 <- ggplot() + 
  geom_polygon(data = map_data('world'), 
               aes(x=long, y = lat, group = group),
               fill='gray20', color='white', size=0.1) +
  geom_point(data=Figure_globe_data, aes(x=Long, y=Lat, size=Sample_size_of_cohort, fill = Association),
            alpha=0.6, shape =21, color = "white") +
  scale_fill_manual(values = c("#CC79A7", "#009E73")) +
  coord_cartesian(xlim = c(-160, 180),
                  ylim = c(-50, 80)) +
  scale_size_continuous('Sample\nsize',
                        range=c(1,12),
                        breaks=c(100, 500, 2000, 5000)) +
  labs(x='Longitude', y='Latitude') +
  theme_classic(base_size = 10) +
  theme(
    panel.grid = element_blank(),
    panel.background = element_rect(fill=alpha('lightsteelblue', 1))
  ) +
  guides(fill = guide_legend(override.aes = list(size = 4, alpha = 1)), size = guide_legend(override.aes = list(shape = 21, color = "black")))
FigureS1

ggsave("./FigureS1.pdf", plot = FigureS1, device = cairo_pdf,  
  width = 16.5,
  height = 7.5,
  units = "cm")

Mice with live C. minuta show lower feed efficiency

C. minuta abundance

metadata_Cmin <- metadata %>% 
  dplyr::filter(MouseID != 6434, MouseID != "6420", # too low DNA yield during DNA extraction --> technical issue
                MouseID != 6477) %>%
  dplyr::left_join(qPCR_data, by ="MouseID")# extreme outlier according to residuals -> excluded for normality reasons 

Fig1_qPCR_Cmin<-metadata_Cmin %>% 
  dplyr::mutate(Cmin_per_gCC_1e7 = qPCR_Cmin_per_gCC / 10000000)  %>% 
  ggplot(aes(x = Category, y = Cmin_per_gCC_1e7, shape = Sex, color = Category)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Category), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_Category, label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Killed" = "Killed-\nCM", "Live" = "Live-\nCM")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  labs(y = expression(paste("C. minuta (GE/g) x",e^7))) +
  theme(axis.text.x = element_text(face = "italic")) 
Fig1_qPCR_Cmin

set.seed(569)
metadata_Cmin$qPCR_Cmin_per_gCC_norm <- predict(bestNormalize(metadata_Cmin$qPCR_Cmin_per_gCC))

options(contrasts=c("contr.sum", "contr.poly"))
model_Cmin<-lmer(qPCR_Cmin_per_gCC_norm ~ Category + qPCR_Round + (Category | Batch), data = metadata_Cmin)
lmerTest::step(model_Cmin)
Backward reduced random-effect table:

                               Eliminated npar  logLik    AIC    LRT Df Pr(>Chisq)    
<none>                                       7 -173.33 360.67                         
Category in (Category | Batch)          0    5 -191.78 393.56 36.888  2  9.771e-09 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Backward reduced fixed-effect table:
Degrees of freedom method: Satterthwaite 

           Eliminated Sum Sq Mean Sq NumDF  DenDF F value    Pr(>F)    
Category            0 9.3749  9.3749     1 11.008  28.863 0.0002254 ***
qPCR_Round          0 9.8730  9.8730     1 11.160  30.396 0.0001733 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
qPCR_Cmin_per_gCC_norm ~ Category + qPCR_Round + (Category | Batch)

Testing model assumptions (normality and heteroscedasticity of residuals)

options(contrasts=c("contr.sum", "contr.poly"))
model_Cmin.2<-lmer(qPCR_Cmin_per_gCC_norm ~ Category + qPCR_Round + (Category | Batch), data = metadata_Cmin)

shapiro.test(residuals(model_Cmin.2)) # test normality of residuals

    Shapiro-Wilk normality test

data:  residuals(model_Cmin.2)
W = 0.98985, p-value = 0.2265
anova(lm(residuals(model_Cmin.2) ~ fitted(model_Cmin.2))) # test for heteroscedasticity 
Analysis of Variance Table

Response: residuals(model_Cmin.2)
                      Df Sum Sq Mean Sq F value Pr(>F)
fitted(model_Cmin.2)   1  0.133 0.13338  0.4445 0.5058
Residuals            179 53.716 0.30009               
plot(model_Cmin.2)

options(contrasts=c("contr.sum", "contr.poly"))
car::Anova(model_Cmin.2, type = "II", test.statistic ="F")
Analysis of Deviance Table (Type II Wald F tests with Kenward-Roger df)

Response: qPCR_Cmin_per_gCC_norm
                F Df Df.res    Pr(>F)    
Category   28.857  1 10.999 0.0002262 ***
qPCR_Round 25.133  1 10.861 0.0004098 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Calculation of means and SD with raw values

model_Cmin.eff<-lmer(qPCR_Cmin_per_gCC ~ Category + qPCR_Round + (Category | Batch), data = metadata_Cmin)
Warning: Model may not have converged with 1 eigenvalue close to zero: 1.5e-11
effects::effect("Category", model_Cmin.eff, se =TRUE) %>% as.data.frame()

examination of C. minuta in Donor sample

Bracken_otu_table_relFreq %>% 
  dplyr::select(-contains(Metagenomics_exclude_id), -taxonomy) %>% 
  dplyr::filter(OTU_ID == "s__Christensenella minuta") %>%
  dplyr::rename(rowname = OTU_ID) %>% 
  tidyr::gather(var, value, -rowname) %>% 
  tidyr::spread(rowname, value) %>% 
  dplyr::rename(sampleid = var, s__Cmin_rel = "s__Christensenella minuta") %>% 
  dplyr::left_join(Metagenomics_metadata_CC, by ="sampleid") %>%
  dplyr::left_join(metadata, by ="MouseID") %>%
  dplyr::mutate(Category = ifelse(grepl("Donor", sampleid), "Donor", Category)) %>% 
  ggplot(aes(x = Category, y = s__Cmin_rel, color = Category)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Category), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = c("black", color_Category), label = c("Donor","Killed-CM", "Live-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Killed" = "Killed-\nCM", "Live" = "Live-\nCM")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  labs(y = "relative C.minuta") +
  theme(axis.text.x = element_text(face = "italic"))

Murine weight and body composition

Body weight

metadata_weight <- metadata %>% 
  dplyr::mutate(Category_Sex = paste(Category, Sex, sep="_")) %>%
  dplyr::select(MouseID, Batch, Sex, Category, Category_Sex, Litter, T0_weight, T1_weight, T2_weight, T3_weight, Promethion_weight) %>%
  dplyr::rename("7" = "T1_weight", "14" = "T2_weight", "21" = "T3_weight", "28" = "Promethion_weight") %>%
  tidyr::gather(Day, weight, "7":"28")

metadata_weight_withT0<- metadata %>%
  dplyr::mutate(Category_Sex = paste(Category, Sex, sep="_")) %>%
  dplyr::select(MouseID, Batch, Sex, Category, Category_Sex, Litter, T0_weight, T1_weight, T2_weight, T3_weight, Promethion_weight) %>%
  dplyr::rename("0" = "T0_weight", "7" = "T1_weight", "14" = "T2_weight", "21" = "T3_weight", "28" = "Promethion_weight") %>%
  tidyr::gather(Day, weight, "0":"28") %>%
  dplyr::mutate(Day = as.numeric(Day))

metadata_weight_withT0.2 <- na.omit(metadata_weight_withT0)

metadata_weight_withT0_summary <- Rmisc::summarySE(metadata_weight_withT0.2, measurevar =  "weight",
                            groupvar = c("Category", "Day", "Sex", "Category_Sex"), conf.interval = 0.95)

FigS2_weight <- ggplot(metadata_weight_withT0_summary, aes(x=Day, y=weight, group=Category_Sex, color=Category)) + 
  geom_line(alpha = 0.7) +
  geom_errorbar(aes(ymin=weight-ci, ymax=weight+ci),
                 position=position_dodge(0.05), alpha = 0.7, linetype = "dashed") +
  geom_point(aes(shape = Sex), size = 3, alpha =1) +
  scale_shape_manual(values=shape_Sex) +
  labs(y = "Weight (g)", x = "Days") +
  scale_color_manual(values=color_Category, label = c(expression(italic("Killed-CM")), expression(italic("Live-CM"))), name = "Treatment") +
  scale_x_continuous(breaks = c(0, 7, 14, 21, 25, 28)) +
  theme_classic(base_size = 10) 
FigS2_weight

statistical analysis

set.seed(673)
metadata_weight$weight_norm<- predict(bestNormalize(metadata_weight$weight))
metadata_weight$T0_weight_norm<- predict(bestNormalize(metadata_weight$T0_weight))

metadata_weight$Day_factor <- as.factor(metadata_weight$Day)
metadata_weight$MouseID_factor <- as.factor(metadata_weight$MouseID)

options(contrasts=c("contr.sum", "contr.poly"))
model_weight<- lmerTest::lmer(weight_norm ~ Category*Sex*Day_factor + T0_weight_norm + (1|Batch/Sex) + (1|MouseID_factor/Batch/Sex), data = metadata_weight)
Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 3 negative eigenvaluesWarning: Model failed to converge with 2 negative eigenvalues: -4.9e-04 -4.9e-04
lmerTest::step(model_weight, keep = "Category")
Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvaluesWarning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvaluesWarning: Model is nearly unidentifiable: large eigenvalue ratio
 - Rescale variables?Warning: Model failed to converge with 1 negative eigenvalue: -2.3e-05Warning: Model is nearly unidentifiable: large eigenvalue ratio
 - Rescale variables?Warning: Model failed to converge with 1 negative eigenvalue: -2.3e-05Warning: Model is nearly unidentifiable: large eigenvalue ratio
 - Rescale variables?Warning: Model failed to converge with 1 negative eigenvalue: -2.3e-05Warning: Model is nearly unidentifiable: large eigenvalue ratio
 - Rescale variables?Warning: Model failed to converge with 1 negative eigenvalue: -2.3e-05Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvaluesWarning: Model failed to converge with 1 negative eigenvalue: -8.0e-05Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvaluesWarning: Model failed to converge with 1 negative eigenvalue: -8.0e-05Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvaluesWarning: Model failed to converge with 1 negative eigenvalue: -8.0e-05Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvaluesWarning: Model failed to converge with 1 negative eigenvalue: -2.7e-05
Backward reduced random-effect table:

                                 Eliminated npar   logLik    AIC    LRT Df Pr(>Chisq)    
<none>                                        23  -41.739 129.48                         
(1 | Sex:(Batch:MouseID_factor))          1   22  -41.739 127.48   0.00  1          1    
(1 | Sex:Batch)                           2   21  -41.739 125.48   0.00  1          1    
(1 | MouseID_factor)                      3   20  -41.739 123.48   0.00  1          1    
(1 | Batch)                               0   19  -69.436 176.87  55.39  1   9.86e-14 ***
(1 | Batch:MouseID_factor)                0   19 -256.417 550.83 429.36  1  < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Backward reduced fixed-effect table:
Degrees of freedom method: Satterthwaite 

                        Eliminated  Sum Sq Mean Sq NumDF  DenDF  F value    Pr(>F)    
Category:Sex:Day_factor          1  0.1798  0.0599     3 534.43   1.9408    0.1220    
Category:Day_factor              2  0.0189  0.0063     3 537.44   0.2033    0.8941    
Category:Sex                     3  0.0089  0.0089     1 169.32   0.2871    0.5928    
Category                         0  0.0453  0.0453     1 170.33   1.4653    0.2278    
T0_weight_norm                   0 10.2728 10.2728     1 180.04 332.3250 < 2.2e-16 ***
Sex:Day_factor                   0  1.1262  0.3754     3 540.45  12.1439 1.059e-07 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
weight_norm ~ Category + Sex + Day_factor + T0_weight_norm + (1 | Batch) + (1 | Batch:MouseID_factor) + Sex:Day_factor

–> not significant for catgeoty or interactions of category wirth other variables –> no treatment effect on weight

Adiposity gain

metadata_gain <- metadata %>%
  dplyr::mutate(T0_fatperc = T0_fatmass/T0_weight*100, 
                T4_fatperc = T4_fatmass/T4_weight*100, 
                adiposity_gain = T4_fatperc - T0_fatperc) %>%
  dplyr::select(MouseID, Sex, Batch, Category, Litter, Promethion_Cabinet, T0_fatperc, T4_fatperc, T0_weight, adiposity_gain) 

Fig1_adiposity <- metadata_gain %>% 
  ggplot(aes(x = Category, y = adiposity_gain, shape = Sex, color = Category)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Category), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_Category, label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Killed" = "Killed-\nCM", "Live" = "Live-\nCM")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  labs(y = "Adiposity gain (%)") +
  theme(axis.text.x = element_text(face = "italic"))  
Fig1_adiposity

statistical analysis

options(contrasts=c("contr.sum", "contr.poly"))
model_adiposity_gain <- lmerTest::lmer(adiposity_gain ~ Category*Sex + T0_fatperc*T0_weight +(1|Batch/Sex), data = metadata_gain)
Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvaluesWarning: Model failed to converge with 1 negative eigenvalue: -2.9e-03
lmerTest::step(model_adiposity_gain, keep = "Category")
Backward reduced random-effect table:

                Eliminated npar  logLik    AIC    LRT Df Pr(>Chisq)
<none>                       10 -406.30 832.61                     
(1 | Sex:Batch)          1    9 -406.30 830.61 0.0000  1     1.0000
(1 | Batch)              2    8 -407.33 830.66 2.0528  1     0.1519

Backward reduced fixed-effect table:
                     Eliminated Df Sum of Sq    RSS    AIC F value  Pr(>F)  
Category:Sex                  1  1     0.109 1729.2 381.59  0.0092 0.92387  
Sex                           2  1     0.141 1729.3 379.60  0.0119 0.91334  
T0_fatperc:T0_weight          3  1    15.273 1744.6 378.94  1.2983 0.25638  
T0_fatperc                    4  1     4.478 1749.0 377.33  0.3799 0.53861  
T0_weight                     5  1    37.965 1787.0 378.59  3.2342 0.07414 .
Category                      0  1     5.387 1792.4 377.05  0.4522 0.50234  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
adiposity_gain ~ Category
model_adiposity_gain.2 <- lm(adiposity_gain ~ Category+ T0_fatperc, data = metadata_gain)
stats::shapiro.test(resid(model_adiposity_gain.2)) # test normality of residuals

    Shapiro-Wilk normality test

data:  resid(model_adiposity_gain.2)
W = 0.99489, p-value = 0.8761
anova(lm(residuals(model_adiposity_gain.2)~fitted.values(model_adiposity_gain.2))) # test for heteroscedasticity 
Analysis of Variance Table

Response: residuals(model_adiposity_gain.2)
                                       Df Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_adiposity_gain.2)   1    0.0   0.000       0      1
Residuals                             150 1784.4  11.896               
plot(model_adiposity_gain.2)

options(contrasts=c("contr.sum", "contr.poly"))
car::Anova(model_adiposity_gain.2, test.statistic="F", type = "III")
Anova Table (Type III tests)

Response: adiposity_gain
             Sum Sq  Df F value    Pr(>F)    
(Intercept)  309.97   1 25.8828 1.076e-06 ***
Category       5.85   1  0.4887    0.4856    
T0_fatperc     2.58   1  0.2155    0.6432    
Residuals   1784.43 149                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

-> no treatment effect

Food intake and feeding efficiency

Promethion_Food <- Promethion.2 %>% 
  dplyr::filter(MouseID != 6438, MouseID != 6450) %>% # spilled food into cage, as mouse was not eating from hopper
  dplyr::filter(Date_common == as.POSIXct("2020-05-04 08:00:00")) %>% # filter endpoint data to obtain food eaten at the end of the experiment
  tidyr::drop_na(Promethion_weight) %>%
  dplyr::mutate(Food_corrected = FoodInA_M - Spilled_Food_cage, 
                FI_kcal = Food_corrected*3.406557, 
                FI_kcal_day = FI_kcal/70*24, 
                FI_kcal_day_BW = FI_kcal_day/Promethion_weight) %>%
  dplyr::group_by(Sex) %>% # exclude outliers, as spilled food might have measurement errors
  dplyr::mutate(lower_bound_FI_kcal_day_BW = median(FI_kcal_day_BW) - 3.5 *mad(FI_kcal_day_BW), 
                upper_bound_FI_kcal_day_BW = median(FI_kcal_day_BW) + 3.5 * mad(FI_kcal_day_BW)) %>%
  dplyr::ungroup() %>%
  dplyr::group_by(MouseID) %>%
  dplyr::filter(dplyr::between(FI_kcal_day_BW, lower_bound_FI_kcal_day_BW, upper_bound_FI_kcal_day_BW)) %>% 
  dplyr::ungroup() %>%
  dplyr::mutate(Feed_eficiency = ((T6_weight - T0_weight)/28)/FI_kcal_day)

Food intake

Fig1_foodintake_weight<- Promethion_Food %>%
  ggplot(aes(x= Promethion_weight ,y=FI_kcal_day, color = Category, group = Category)) +
  geom_smooth( method = "lm", se = F, alpha = 0.8, size = 0.5, show.legend = F)+ 
  geom_point(aes(shape = Sex), alpha =0.7, size =0.75, show.legend = T) +
  scale_shape_manual(values=c(16, 4), name = "Sex", label = c("Female", "Male")) + 
  scale_color_manual(values=c(color_Category), label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  theme_classic(base_size = 10) +
  labs(y = "Food intake (kcal/d)", x = "Weight (g)") 
Fig1_foodintake_weight

Higher food intake
Statistical analysis:

set.seed(628)
Promethion_Food$FI_kcal_day_norm <- predict(bestNormalize(Promethion_Food$FI_kcal_day))
Promethion_Food$Promethion_weight_norm <- predict(bestNormalize(Promethion_Food$Promethion_weight))

options(contrasts=c("contr.sum", "contr.poly"))
model_food <- lmerTest::lmer(FI_kcal_day_norm ~ Category*Sex + Sex*Promethion_weight_norm + (Category|Batch/Sex/Promethion_Cabinet), data = Promethion_Food)
boundary (singular) fit: see help('isSingular')
lmerTest::step(model_food, keep = "Category")
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -2.8e-03boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -1.9e-01boundary (singular) fit: see help('isSingular')
Backward reduced random-effect table:

                                                        Eliminated npar  logLik    AIC     LRT Df Pr(>Chisq)
<none>                                                               16 -219.15 470.29                      
Category in (Category | Sex:Batch)                               1   14 -219.15 466.29 0.00000  2     1.0000
(1 | Sex:Batch)                                                  2   13 -219.15 464.29 0.00000  1     1.0000
Category in (Category | Batch)                                   3   11 -219.15 460.29 0.00000  2     1.0000
Category in (Category | Promethion_Cabinet:(Sex:Batch))          4    9 -219.75 457.50 1.20694  2     0.5469
(1 | Promethion_Cabinet:(Sex:Batch))                             5    8 -219.75 455.50 0.00000  1     1.0000
(1 | Batch)                                                      6    7 -219.75 453.50 0.00072  1     0.9786

Backward reduced fixed-effect table:
                           Eliminated Df Sum of Sq    RSS     AIC F value    Pr(>F)    
Category:Sex                        1  1    0.0019 117.19 -53.244  0.0026 0.9593051    
Sex:Promethion_weight_norm          2  1    0.2236 117.41 -54.920  0.3148 0.5755352    
Category                            0  1    2.6423 120.05 -53.137  3.7358 0.0549586 .  
Sex                                 0  1    9.9013 127.31 -43.157 13.9988 0.0002517 ***
Promethion_weight_norm              0  1    3.9688 121.38 -51.269  5.6112 0.0189955 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
FI_kcal_day_norm ~ Category + Sex + Promethion_weight_norm
options(contrasts=c("contr.sum", "contr.poly"))
model_food.2 <- lm(FI_kcal_day_norm ~ Category+Sex+Promethion_weight_norm, data = Promethion_Food)
stats::shapiro.test(residuals(model_food.2))

    Shapiro-Wilk normality test

data:  residuals(model_food.2)
W = 0.98681, p-value = 0.1106
anova(lm(residuals(model_food.2)~fitted.values(model_food.2)))
Analysis of Variance Table

Response: residuals(model_food.2)
                             Df Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_food.2)   1   0.00 0.00000       0      1
Residuals                   168 117.41 0.69887               
plot(model_food.2)

options(contrasts=c("contr.sum", "contr.poly"))
car::Anova(model_food.2, test.statistic="F", type = "II")
Anova Table (Type II tests)

Response: FI_kcal_day_norm
                        Sum Sq  Df F value    Pr(>F)    
Category                 2.642   1  3.7358 0.0549586 .  
Sex                      9.901   1 13.9988 0.0002517 ***
Promethion_weight_norm   3.969   1  5.6112 0.0189955 *  
Residuals              117.411 166                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
model_food_eff <- lm(FI_kcal_day ~ Category+Sex+Promethion_weight, data = Promethion_Food)
effects::effect("Category", model_food_eff, se =TRUE) %>% as.data.frame()
(14.25670-13.59437)
[1] 0.66233
(14.25670-13.59437)/13.59437*100
[1] 4.87209
model_food.residuals <- lm(FI_kcal_day_norm ~ Sex + Promethion_weight_norm, data = Promethion_Food)
Promethion_Food$FI_kcal_day_residuals <- residuals(model_food.residuals)/sigma(model_food.residuals)

Fig1_foodintake_resid <- Promethion_Food %>%
  ggplot(aes(x = Category, y = FI_kcal_day_residuals, shape = Sex, color = Category)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Category), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_Category, label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Killed" = "Killed-\nCM", "Live" = "Live-\nCM")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  labs(y = "Adj. food intake") +
  theme(axis.text.x = element_text(face = "italic")) 
Fig1_foodintake_resid

Feed efficiency

Fig1_feed_eff<- Promethion_Food %>%
  ggplot(aes(x = Category, y = Feed_eficiency, shape = Sex, color = Category)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Category), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_Category, label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Killed" = "Killed-\nCM", "Live" = "Live-\nCM")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  labs(y = "Feed efficicency (g/kcal)") +
  theme(axis.text.x = element_text(face = "italic")) 
Fig1_feed_eff

Lower feed efficiency Statistical analysis:

set.seed(8765)
Promethion_Food$Feed_eficiency_norm <- predict(bestNormalize(Promethion_Food$Feed_eficiency))

options(contrasts=c("contr.sum", "contr.poly"))
model_feed_eff <- lmer(Feed_eficiency_norm ~ Sex*Category + (Category |Batch/Sex/Promethion_Cabinet), data = Promethion_Food)
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -1.8e-03
step(model_feed_eff, keep = "Category")
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -1.7e-03boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
Backward reduced random-effect table:

                                                        Eliminated npar  logLik    AIC     LRT Df Pr(>Chisq)    
<none>                                                               14 -227.99 483.98                          
Category in (Category | Sex:Batch)                               1   12 -227.99 479.98  0.0000  2     1.0000    
(1 | Sex:Batch)                                                  2   11 -227.99 477.98  0.0000  1     1.0000    
Category in (Category | Promethion_Cabinet:(Sex:Batch))          3    9 -228.01 474.02  0.0434  2     0.9786    
(1 | Promethion_Cabinet:(Sex:Batch))                             4    8 -228.01 472.02  0.0000  1     1.0000    
Category in (Category | Batch)                                   5    6 -228.40 468.79  0.7687  2     0.6809    
(1 | Batch)                                                      0    5 -243.68 497.35 30.5565  1  3.243e-08 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Backward reduced fixed-effect table:
Degrees of freedom method: Satterthwaite 

             Eliminated Sum Sq Mean Sq NumDF   DenDF F value  Pr(>F)  
Sex:Category          1 0.9106  0.9106     1 156.499  1.2589 0.26357  
Sex                   2 0.3354  0.3354     1  10.065  0.4628 0.51166  
Category              0 3.6370  3.6370     1 157.522  5.0187 0.02647 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
Feed_eficiency_norm ~ Category + (1 | Batch)
model_feed_eff.2 <- lmer(Feed_eficiency_norm ~ Category  + (1 | Batch), data = Promethion_Food)
stats::shapiro.test(residuals(model_feed_eff.2))

    Shapiro-Wilk normality test

data:  residuals(model_feed_eff.2)
W = 0.9927, p-value = 0.5503
anova(lm(residuals(model_feed_eff.2)~fitted.values(model_feed_eff.2)))
Analysis of Variance Table

Response: residuals(model_feed_eff.2)
                                 Df  Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_feed_eff.2)   1   1.107  1.1073  1.6327 0.2031
Residuals                       168 113.937  0.6782               
plot(model_feed_eff.2)

options(contrasts=c("contr.sum", "contr.poly"))
car::Anova(model_feed_eff.2, test.statistic="F", type = "II")
Analysis of Deviance Table (Type II Wald F tests with Kenward-Roger df)

Response: Feed_eficiency_norm
              F Df Df.res  Pr(>F)  
Category 5.0157  1 157.49 0.02652 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
model_feed_eff_eff <- lmer(Feed_eficiency ~ Category  + (1 | Batch), data = Promethion_Food)
effects::effect("Category", model_feed_eff_eff)

 Category effect
Category
    Killed       Live 
0.01919142 0.01719512 
as.data.frame(effect("Category", model_feed_eff_eff, se = TRUE))

Fecal energy loss

metadata_bc <- metadata  %>%
  dplyr::mutate(bombcal_Calorific_Value_kcal = bombcal_Calorific_Value/4184, # convert bombcal_Calorific_Value from J/g to kcal/g
                bombcal_Calorific_Value_kcal_total = bombcal_Calorific_Value_kcal*bombcal_Dry_sample_mass,  # total energy content of 3 days in metabolic cages
                bombcal_Calorific_Value_kcal_total_day = bombcal_Calorific_Value_kcal_total/70*24, # calculate daily energy excretion
                bombcal_weight = bombcal_Calorific_Value_kcal_total_day / Promethion_weight) %>% # normalization by murine body weight for outlier detection
  tidyr::drop_na(bombcal_weight) %>%
  dplyr::group_by() %>%
  dplyr::mutate(lower_bound_bombcal_weight= median(bombcal_weight, rm.na = TRUE) - 3 *mad(bombcal_weight),
                upper_bound_bombcal_weight = median(bombcal_weight, rm.na = TRUE) + 3 * mad(bombcal_weight)) %>%
  dplyr::group_by(MouseID) %>%
  dplyr::filter(dplyr::between(bombcal_weight, lower_bound_bombcal_weight, upper_bound_bombcal_weight)) %>% # exclude outliers 
  dplyr::ungroup() 

Fecal mass

metadata_bc%>%
  ggplot(aes(x = Category, y = bombcal_Dry_sample_mass, shape = Sex, color = Category)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Category), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_Category, label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Killed" = "Killed-\nCM", "Live" = "Live-\nCM")) +
  theme_classic(base_size = 10) +
  labs(y = "Fecal mass (g)") +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  theme(axis.text.x = element_text(face = "italic")) 

set.seed(628)

metadata_bc$Promethion_weight_norm <- predict(bestNormalize(metadata_bc$Promethion_weight))
metadata_bc$bombcal_Dry_sample_mass_norm <- predict(bestNormalize(metadata_bc$bombcal_Dry_sample_mass))
options(contrasts=c("contr.sum", "contr.poly"))
model_fecal_mass <- lmerTest::lmer(bombcal_Dry_sample_mass_norm ~ Category*Sex + Promethion_weight_norm +(Category|Batch/Sex/Promethion_Cabinet), data = metadata_bc)
boundary (singular) fit: see help('isSingular')
lmerTest::step(model_fecal_mass, keep = "Category")
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -4.6e-04boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -3.8e-01boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
Backward reduced random-effect table:

                                                        Eliminated npar  logLik    AIC     LRT Df Pr(>Chisq)    
<none>                                                               15 -110.05 250.10                          
Category in (Category | Sex:Batch)                               1   13 -110.05 246.10  0.0000  2   1.000000    
Category in (Category | Batch)                                   2   11 -110.05 242.10  0.0002  2   0.999893    
(1 | Sex:Batch)                                                  3   10 -110.05 240.10  0.0000  1   1.000000    
(1 | Batch)                                                      4    9 -110.05 238.10  0.0000  1   0.999987    
Category in (Category | Promethion_Cabinet:(Sex:Batch))          5    7 -110.28 234.56  0.4645  2   0.792758    
(1 | Promethion_Cabinet:(Sex:Batch))                             0    6 -116.09 244.19 11.6298  1   0.000649 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Backward reduced fixed-effect table:
Degrees of freedom method: Satterthwaite 

                       Eliminated Sum Sq Mean Sq NumDF  DenDF F value    Pr(>F)    
Category:Sex                    1 1.5791  1.5791     1 73.881  2.8956 0.0930256 .  
Sex                             2 0.7409  0.7409     1 19.157  1.3193 0.2648533    
Category                        0 0.2832  0.2832     1 75.248  0.5050 0.4795190    
Promethion_weight_norm          0 8.0941  8.0941     1 58.575 14.4345 0.0003475 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
bombcal_Dry_sample_mass_norm ~ Category + Promethion_weight_norm + (1 | Promethion_Cabinet:(Sex:Batch))
options(contrasts=c("contr.sum", "contr.poly"))
model_fecal_mass.2 <- lmer(bombcal_Dry_sample_mass_norm ~ Category + Promethion_weight_norm + (1 | Promethion_Cabinet:(Sex:Batch)), data = metadata_bc)
stats::shapiro.test(residuals(model_fecal_mass.2))

    Shapiro-Wilk normality test

data:  residuals(model_fecal_mass.2)
W = 0.969, p-value = 0.03315
anova(lm(residuals(model_fecal_mass.2)~fitted.values(model_fecal_mass.2)))
Analysis of Variance Table

Response: residuals(model_fecal_mass.2)
                                  Df Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_fecal_mass.2)  1  0.576 0.57595  1.1625  0.284
Residuals                         86 42.607 0.49543               
plot(model_fecal_mass.2)

car::Anova(model_fecal_mass.2, test.statistic="F", type = "II")
Analysis of Deviance Table (Type II Wald F tests with Kenward-Roger df)

Response: bombcal_Dry_sample_mass_norm
                             F Df Df.res    Pr(>F)    
Category                0.5036  1 75.173 0.4801212    
Promethion_weight_norm 13.1062  1 58.418 0.0006165 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
model_fecal_mass_resid <- lmer(bombcal_Dry_sample_mass_norm ~ Sex + Promethion_weight_norm+ (1 | Promethion_Cabinet:(Sex:Batch)), data = metadata_bc)

metadata_bc$bombcal_Dry_sample_mass_resid <- residuals(model_fecal_mass_resid)/sigma(model_fecal_mass_resid)

FigS2_fecal_mass <-  metadata_bc%>%
  ggplot(aes(x = Category, y = bombcal_Dry_sample_mass_resid, shape = Sex, color = Category)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Category), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_Category, label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Killed" = "Killed-\nCM", "Live" = "Live-\nCM")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  labs(y = "Adj. fecal mass") +
  theme(axis.text.x = element_text(face = "italic")) 
FigS2_fecal_mass

-> no difference between treatment groups

Bomb calorimetry

metadata_bc %>%
  ggplot(aes(x= Promethion_weight ,y=bombcal_Calorific_Value_kcal_total_day, color = Category, group = Category)) +
  geom_smooth( method = "lm", se = F, alpha = 0.8, size = 0.5, show.legend = F)+ 
  geom_point(aes(shape = Sex), alpha =0.7, size =0.75, show.legend = T) +
  scale_shape_manual(values=c(16, 4), name = "Sex", label = c("Female", "Male")) + 
  scale_color_manual(values=c(color_Category), name = "Treatment", label = c("Killed-CM", "Live-CM")) +
  theme_classic(base_size = 10) +
  labs(y = "Fecal Energy (kcal/g/d)", x = "Weight (g)")

set.seed(628)

metadata_bc$bombcal_Calorific_Value_kcal_total_day_norm <- predict(bestNormalize(metadata_bc$bombcal_Calorific_Value_kcal_total_day))

options(contrasts=c("contr.sum", "contr.poly"))
model_Bomb_cal <- lmerTest::lmer(bombcal_Calorific_Value_kcal_total_day_norm ~ Category*Sex + Promethion_weight_norm +(Category|Batch/Sex/Promethion_Cabinet), data = metadata_bc)
boundary (singular) fit: see help('isSingular')
lmerTest::step(model_Bomb_cal, keep = "Category")
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -9.5e-02boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -1.7e-01boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
Backward reduced random-effect table:

                                                        Eliminated npar  logLik    AIC    LRT Df Pr(>Chisq)   
<none>                                                               15 -112.34 254.67                        
Category in (Category | Sex:Batch)                               1   13 -112.34 250.67 0.0000  2    1.00000   
Category in (Category | Batch)                                   2   11 -112.35 246.70 0.0243  2    0.98793   
(1 | Sex:Batch)                                                  3   10 -112.35 244.70 0.0000  1    1.00000   
(1 | Batch)                                                      4    9 -112.35 242.70 0.0000  1    0.99998   
Category in (Category | Promethion_Cabinet:(Sex:Batch))          5    7 -112.42 238.83 0.1379  2    0.93336   
(1 | Promethion_Cabinet:(Sex:Batch))                             0    6 -116.55 245.10 8.2613  1    0.00405 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Backward reduced fixed-effect table:
Degrees of freedom method: Satterthwaite 

                       Eliminated  Sum Sq Mean Sq NumDF  DenDF F value    Pr(>F)    
Category:Sex                    1  1.1012  1.1012     1 74.155  1.8706 0.1755404    
Sex                             2  0.3468  0.3468     1 21.090  0.5803 0.4546367    
Category                        0  0.0772  0.0772     1 75.677  0.1295 0.7199197    
Promethion_weight_norm          0 10.4462 10.4462     1 49.255 17.5286 0.0001165 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
bombcal_Calorific_Value_kcal_total_day_norm ~ Category + Promethion_weight_norm + (1 | Promethion_Cabinet:(Sex:Batch))
options(contrasts=c("contr.sum", "contr.poly"))
model_Bomb_cal.2 <- lmer(bombcal_Calorific_Value_kcal_total_day_norm ~ Category + Promethion_weight_norm+ (1 | Promethion_Cabinet:(Sex:Batch)), data = metadata_bc)
stats::shapiro.test(residuals(model_Bomb_cal.2))

    Shapiro-Wilk normality test

data:  residuals(model_Bomb_cal.2)
W = 0.98781, p-value = 0.5867
anova(lm(residuals(model_Bomb_cal.2)~fitted.values(model_Bomb_cal.2)))
Analysis of Variance Table

Response: residuals(model_Bomb_cal.2)
                                Df Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_Bomb_cal.2)  1  0.575 0.57495  1.0799 0.3016
Residuals                       86 45.788 0.53242               
plot(model_Bomb_cal.2)

options(contrasts=c("contr.sum", "contr.poly"))
car::Anova(model_Bomb_cal.2, test.statistic="F", type = "II")
Analysis of Deviance Table (Type II Wald F tests with Kenward-Roger df)

Response: bombcal_Calorific_Value_kcal_total_day_norm
                             F Df Df.res    Pr(>F)    
Category                0.1291  1 75.434 0.7203622    
Promethion_weight_norm 15.7971  1 48.654 0.0002331 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
model_Bomb_cal_resid <- lmer(bombcal_Calorific_Value_kcal_total_day_norm ~ Sex + Promethion_weight_norm+ (1 | Promethion_Cabinet:(Sex:Batch)), data = metadata_bc)
metadata_bc$bombcal_Calorific_Value_kcal_total_day_resid <- residuals(model_Bomb_cal_resid)/sigma(model_Bomb_cal_resid)

Fig1_fecal_energy <- metadata_bc%>%
  ggplot(aes(x = Category, y = bombcal_Calorific_Value_kcal_total_day_resid, shape = Sex, color = Category)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Category), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_Category, label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Killed" = "Killed-\nCM", "Live" = "Live-\nCM")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  labs(y = "Adj. fecal energy conetnt") +
  theme(axis.text.x = element_text(face = "italic")) 
Fig1_fecal_energy

-> no difference between treatment groups ### Figure 1 - Effects of live or heat-killed C. minuta amendment to fecal transplants to GF mice on C. minuta, murine adiposity, feed efficiency and fecal energy loss four weeks post inoculation.

Legend_treatment_sex <- cowplot::get_legend(metadata_Cmin %>% 
  dplyr::mutate(Sex = ifelse(Sex == "F", "Female", "Male"), 
                Category = ifelse(Category == "Killed", "Killed-CM", "Live-CM"), 
                Sex_Category = paste(Sex, Category, sep = " ")) %>%
  ggplot(aes(x = Category, y = qPCR_Cmin_per_gCC, shape = Sex_Category, color = Sex_Category)) + 
  geom_point(aes(shape = Sex_Category, color= Sex_Category), alpha =0.7, size =0.5, show.legend = T) +
  scale_shape_manual(values=c(16, 16,4, 4)) + 
  scale_color_manual(values=c(color_Category, color_Category)) +
  theme_classic(base_size = 10) +
  guides(shape = guide_legend(override.aes = list(size = 3, alpha = 1))) +
  theme(legend.title=element_blank()))
Fig1_align <- cowplot::align_plots(Fig1_qPCR_Cmin + theme(legend.position="none"),
                                   Fig1_adiposity + theme(legend.position="none"),  
                                   Fig1_foodintake_weight + theme(legend.position="none"),
                                   Fig1_foodintake_resid + theme(legend.position="none"),
                                   Fig1_feed_eff + theme(legend.position="none"), 
                                   Fig1_fecal_energy + theme(legend.position="none"),
                                   align = 'hv', axis = 'tblr')
Warning: Removed 32 rows containing non-finite values (stat_summary).Warning: Removed 32 rows containing missing values (position_quasirandom).`geom_smooth()` using formula 'y ~ x'
                      
Fig1_1 <- cowplot::plot_grid(Fig1_align[[1]], 
                               Fig1_align[[2]],
                               Fig1_align[[5]],
                               Fig1_align[[6]],
                               ncol=2, nrow=2, labels = c("B", "C", "F", "G"),label_size = 12, rel_widths = c(1,1), rel_heights = c(1,1))

Fig1_2 <- cowplot::plot_grid(Fig1_align[[4]],
                               Legend_treatment_sex,
                               ncol=1, nrow=2, labels = c("E", NA),label_size = 12, rel_heights = c(1,1))

Fig1_3 <- cowplot::plot_grid(Fig1_align[[3]],
                               Fig1_2,
                               ncol=2, nrow=1, labels = c("D", NA),label_size = 12, rel_widths = c(1,1))
Warning: Removed 1 rows containing missing values (geom_text).
Figure1 <- cowplot::plot_grid(Fig1_1, 
                             Fig1_3,
                             ncol=2, nrow = 1, rel_widths = c(1,1))
Warning: Removed 1 rows containing missing values (geom_text).
Figure1

ggsave("./Figure1.pdf", plot = Figure1, device = cairo_pdf,  
  width = 17,
  height = 10.5,
  units = "cm")

Figure S2 - Murine body weight gain and fecal mass.

FigS2_align <- cowplot::align_plots(FigS2_weight + theme(legend.position="none"),
                                   FigS2_fecal_mass + theme(legend.position="none"),
                                   align = 'hv', axis = 'tblr')
                      
FigureS2 <- cowplot::plot_grid(FigS2_align[[1]], 
                               FigS2_align[[2]],
                               Legend_treatment_sex,
                               ncol=3, nrow=1, labels = c("A", "B", NA),label_size = 12, rel_widths = c(1.5,1, 0.75))
FigureS2

ggsave("./FigureS2.pdf", plot = Fig_supp.fe, device = cairo_pdf,  
  width = 13,
  height = 6.5,
  units = "cm")

C. minuta amended mice displayed higher physical activity and metabolic energy expenditure in a sex-dependent manner

Activity

For the activity data the acclimatization period is removed, as activity is highly influenced by stress

Promethion_activity_ee <- Promethion.2 %>% # create a common dataset to calculate EE and activity
  base::subset(Date_common >= as.POSIXct('2020-05-02 08:00:00') & Date_common <= as.POSIXct('2020-05-04 08:00:00')) %>% # exclude acclimatization period and end of experiment 
  dplyr::mutate(PedSpeed_Mnz = ifelse(PedSpeed_Mnz > 0, PedSpeed_Mnz, NA)) %>% # exclude speed when animals where not running
  dplyr::group_by(MouseID) %>%
  dplyr::summarise(Distance_traveled = sum(AllMeters_R), 
                   Beam_breaks = sum(XBreak_R) + sum(YBreak_R) + sum(ZBreak_R), 
                   mean_running_speed = mean(PedSpeed_Mnz, na.rm=TRUE),
                   EE_average_per_hour = mean(kcal_hr_M)) %>%
  dplyr::ungroup() %>%
  dplyr::left_join(metadata, by ="MouseID") 

Promethion_activity <- Promethion_activity_ee %>% # exclude mice with suspicious activity measurements 
  dplyr::group_by(Batch) %>% 
  dplyr::mutate(lower_bound_Distance_traveled = median(Distance_traveled) - 3 * mad(Distance_traveled),
                upper_bound_Distance_traveled = median(Distance_traveled) + 3 * mad(Distance_traveled),
                lower_bound_Beam_breaks = median(Beam_breaks) - 3 * mad(Beam_breaks), 
                upper_bound_Beam_breaks = median(Beam_breaks) + 3 * mad(Beam_breaks)) %>%
  dplyr::ungroup() %>%
  dplyr::group_by(MouseID) %>% 
  dplyr::filter(dplyr::between(Distance_traveled, lower_bound_Distance_traveled, upper_bound_Distance_traveled) | 
                dplyr::between(Beam_breaks, lower_bound_Beam_breaks, upper_bound_Beam_breaks)) %>%
  dplyr::ungroup() 

Beam breaks

Promethion_activity %>%
  ggplot(aes(x = Category, y = Beam_breaks, shape = Sex, color = Category)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Category), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_Category, label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Killed" = "Killed-\nCM", "Live" = "Live-\nCM")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  labs(y = "# Beam breaks") +
  theme(axis.text.x = element_text(face = "italic")) 

options(contrasts=c("contr.sum", "contr.poly"))
model_Beam_breaks<-(lmer(Beam_breaks ~ Category*Sex + (Category|Batch/Sex/Promethion_Cabinet), Promethion_activity))
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -1.2e-03
step(model_Beam_breaks, keep ="Category")
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -1.5e-03boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
Backward reduced random-effect table:

                                                        Eliminated npar  logLik    AIC    LRT Df Pr(>Chisq)    
<none>                                                               14 -2043.9 4115.8                         
Category in (Category | Sex:Batch)                               1   12 -2043.9 4111.8  0.002  2     0.9991    
(1 | Sex:Batch)                                                  2   11 -2043.9 4109.8 -0.002  1     1.0000    
Category in (Category | Batch)                                   3    9 -2044.0 4105.9  0.147  2     0.9292    
Category in (Category | Promethion_Cabinet:(Sex:Batch))          4    7 -2044.3 4102.6  0.680  2     0.7116    
(1 | Promethion_Cabinet:(Sex:Batch))                             5    6 -2044.9 4101.8  1.191  1     0.2751    
(1 | Batch)                                                      0    5 -2071.5 4153.1 53.259  1  2.924e-13 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Backward reduced fixed-effect table:
Degrees of freedom method: Satterthwaite 

             Eliminated     Sum Sq    Mean Sq NumDF   DenDF F value   Pr(>F)   
Category:Sex          1   22646547   22646547     1 169.185  0.0591 0.808218   
Category              0 2647923943 2647923943     1 170.178  6.9489 0.009163 **
Sex                   0 1917488030 1917488030     1  10.077  5.0320 0.048544 * 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
Beam_breaks ~ Category + Sex + (1 | Batch)
options(contrasts=c("contr.sum", "contr.poly"))
model_Beam_breaks.2<-(lmerTest::lmer(Beam_breaks ~ Category + Sex  + (1 | Batch), Promethion_activity))
stats::shapiro.test(resid(model_Beam_breaks.2))

    Shapiro-Wilk normality test

data:  resid(model_Beam_breaks.2)
W = 0.99105, p-value = 0.3134
anova(lm(residuals(model_Beam_breaks.2)~fitted.values(model_Beam_breaks.2)))
Analysis of Variance Table

Response: residuals(model_Beam_breaks.2)
                                    Df     Sum Sq   Mean Sq F value Pr(>F)
fitted.values(model_Beam_breaks.2)   1 2.1460e+08 214596001  0.5981 0.4403
Residuals                          181 6.4937e+10 358767710               
plot(model_Beam_breaks.2)

options(contrasts=c("contr.sum", "contr.poly"))
car::Anova(model_Beam_breaks.2, type="II", test.statistic="F")
Analysis of Deviance Table (Type II Wald F tests with Kenward-Roger df)

Response: Beam_breaks
              F Df Df.res   Pr(>F)   
Category 6.9480  1  170.1 0.009167 **
Sex      5.0319  1   10.0 0.048740 * 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
effects::effect("Category", model_Beam_breaks.2, se =TRUE) %>% as.data.frame()
(119692.2-112072.3)/112072.3*100
[1] 6.799093
model_Beam_breaks.residuals <-(lmerTest::lmer(Beam_breaks ~ Sex + (1 | Batch), Promethion_activity))
Promethion_activity$Beam_breaks_residuals <- residuals(model_Beam_breaks.residuals)/sigma(model_Beam_breaks.residuals)

Fig2_beam_breaks <- Promethion_activity %>% 
  ggplot(aes(x = Category, y = Beam_breaks_residuals, shape = Sex, color = Category)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Category), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_Category, label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Killed" = "Killed-\nCM", "Live" = "Live-\nCM")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  labs(y = "Adj. beam breaks") +
  theme(axis.text.x = element_text(face = "italic")) 
Fig2_beam_breaks

-> significant more beam breaks by treatment

Distance traveled

Promethion_activity %>%
  ggplot(aes(x = Category, y = Distance_traveled, shape = Sex, color = Category)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Category), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_Category, label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Killed" = "Killed-\nCM", "Live" = "Live-\nCM")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  labs(y = "Distance traveled (m)") +
  theme(axis.title.x=element_blank()) +
  theme(axis.text.x = element_text(face = "italic")) +
  facet_grid(Sex~.) +
     theme(strip.background = element_blank(),
        strip.text = element_blank())  +
  theme(axis.text.x = element_text(face = "italic")) 

–> although not statistically significant, exact analysis of data results in assumption of different treatment effects in males and females –> separate statistical analysis

options(contrasts=c("contr.sum", "contr.poly"))
Promethion_activity_M <- Promethion_activity %>% dplyr::filter(Sex =="M")
Promethion_activity_F <- Promethion_activity %>% dplyr::filter(Sex =="F")

model_Distance_traveled.m<-(lmerTest::lmer(Distance_traveled_norm ~ Category + (1 | Batch), Promethion_activity_M))
stats::shapiro.test(resid(model_Distance_traveled.m))

    Shapiro-Wilk normality test

data:  resid(model_Distance_traveled.m)
W = 0.97503, p-value = 0.08364
anova(lm(residuals(model_Distance_traveled.m)~fitted.values(model_Distance_traveled.m)))
Analysis of Variance Table

Response: residuals(model_Distance_traveled.m)
                                         Df Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_Distance_traveled.m)  1  0.214 0.21431  0.5092 0.4774
Residuals                                87 36.616 0.42087               
model_Distance_traveled.f<-(lmerTest::lmer(Distance_traveled_norm ~ Category + (1 | Batch), Promethion_activity_F))
stats::shapiro.test(resid(model_Distance_traveled.f))

    Shapiro-Wilk normality test

data:  resid(model_Distance_traveled.f)
W = 0.95915, p-value = 0.00503
anova(lm(residuals(model_Distance_traveled.f)~fitted.values(model_Distance_traveled.f)))
Analysis of Variance Table

Response: residuals(model_Distance_traveled.f)
                                         Df Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_Distance_traveled.f)  1  0.337 0.33669  0.5234 0.4712
Residuals                                92 59.180 0.64326               
car::Anova(model_Distance_traveled.m, test.statistic ="F", type="II")
Analysis of Deviance Table (Type II Wald F tests with Kenward-Roger df)

Response: Distance_traveled_norm
              F Df Df.res  Pr(>F)  
Category 4.6931  1 82.118 0.03318 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
car::Anova(model_Distance_traveled.f, test.statistic ="F", type="II")
Analysis of Deviance Table (Type II Wald F tests with Kenward-Roger df)

Response: Distance_traveled_norm
              F Df Df.res Pr(>F)
Category 0.0194  1     87 0.8897
model_Distance_traveled.meff<-(lmerTest::lmer(Distance_traveled ~ Category + (1 | Batch), Promethion_activity_M))
effects::effect("Category", model_Distance_traveled.meff, se =TRUE) %>% as.data.frame

model_Distance_traveled.feff<-(lmerTest::lmer(Distance_traveled ~ Category + (1 | Batch), Promethion_activity_F))
effects::effect("Category", model_Distance_traveled.feff, se =TRUE) %>% as.data.frame
model_Distance_traveled.m_residuals <-(lmerTest::lmer(Distance_traveled_norm ~ (1 | Batch), Promethion_activity_M))
model_Distance_traveled.f_residuals <-(lmerTest::lmer(Distance_traveled_norm ~ (1 | Batch), Promethion_activity_F))

Promethion_activity_M$Distance_traveled_residuals <- residuals(model_Distance_traveled.m_residuals)/sigma(model_Distance_traveled.m_residuals)
Promethion_activity_F$Distance_traveled_residuals <- residuals(model_Distance_traveled.f_residuals)/sigma(model_Distance_traveled.f_residuals)

Promethion_activity_MF<- rbind(Promethion_activity_M, Promethion_activity_F) 

Fig2_distance <- Promethion_activity_MF%>% 
  ggplot(aes(x = Category, y = Distance_traveled_residuals, shape = Sex, color = Category)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Category), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_Category, label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Killed" = "Killed-\nCM", "Live" = "Live-\nCM")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  labs(y = "Adj. distance traveled", x= "Treatment") +
  theme(axis.title.x=element_blank()) +
  theme(axis.text.x = element_text(face = "italic")) +
  facet_grid(Sex~.) +
     theme(strip.background = element_blank(),
        strip.text = element_blank())  +
  theme(axis.text.x = element_text(face = "italic"))
Fig2_distance

Mean running speed

FigS3_speed <- Promethion_activity %>% 
  ggplot(aes(x = Category, y = mean_running_speed, shape = Sex, color = Category)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Category), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_Category, label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Killed" = "Killed-\nCM", "Live" = "Live-\nCM")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  labs(y ="Mean running speed (m/s)") +
  theme(axis.text.x = element_text(face = "italic")) 
FigS3_speed

set.seed(874)

Promethion_activity <- Promethion_activity %>%
  dplyr::mutate(mean_running_speed_norm = predict(bestNormalize(mean_running_speed)))


model_speed <- lmer(mean_running_speed_norm ~ Category*Sex + Promethion_Cabinet + (1|Batch), data = Promethion_activity)
step(model_speed)
Backward reduced random-effect table:

            Eliminated npar  logLik    AIC    LRT Df Pr(>Chisq)  
<none>                    7 -255.23 524.46                       
(1 | Batch)          0    6 -257.10 526.20 3.7438  1      0.053 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Backward reduced fixed-effect table:
Degrees of freedom method: Satterthwaite 

                   Eliminated Sum Sq Mean Sq NumDF  DenDF F value  Pr(>F)  
Category:Sex                1 0.0004  0.0004     1 168.17  0.0004 0.98380  
Promethion_Cabinet          2 0.1160  0.1160     1 168.75  0.1362 0.71259  
Category                    3 1.3672  1.3672     1 170.15  1.6129 0.20581  
Sex                         0 7.6179  7.6179     1   9.71  8.9641 0.01391 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
mean_running_speed_norm ~ Sex + (1 | Batch)
model_speed.2 <- lmer(mean_running_speed_norm ~ Category + Sex + (1|Batch), data = Promethion_activity)
shapiro.test(residuals(model_speed.2))

    Shapiro-Wilk normality test

data:  residuals(model_speed.2)
W = 0.98784, p-value = 0.1176
anova(lm(residuals(model_speed.2)~fitted.values(model_speed.2)))
Analysis of Variance Table

Response: residuals(model_speed.2)
                              Df  Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_speed.2)   1   0.915 0.91534  1.1278 0.2897
Residuals                    181 146.908 0.81165               
plot(model_speed.2)

car::Anova(model_speed.2, test.statistic ="F", type ="II")
Analysis of Deviance Table (Type II Wald F tests with Kenward-Roger df)

Response: mean_running_speed_norm
              F Df  Df.res  Pr(>F)  
Category 1.6121  1 170.444 0.20593  
Sex      9.0239  1   9.995 0.01326 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
model_speed.eff <- lmer(mean_running_speed ~ Category + Sex + (1|Batch), data = Promethion_activity)
effects::effect("Category", model_speed.eff, se =TRUE) %>% as.data.frame()

correlation of activity to C. minuta abundance

Promethion_activity_MF_Cmin<- Promethion_activity_MF %>% 
  dplyr::left_join(qPCR_data, by ="MouseID")

Promethion_activity_MF_Cmin %>%
  ggplot(aes(x= qPCR_Cmin_per_gCC ,y=Beam_breaks_residuals)) +
  geom_smooth(method = "lm", se = F,  alpha = 0.8, size = 0.5, color = "black")+ 
  geom_point(aes(shape = Sex, color = Category), alpha =0.7, size =0.75, show.legend = T) +
  scale_shape_manual(values=shape_Sex, label = c("Female", "Male"),name = "Sex") + 
  scale_color_manual(values=color_Category, label = c(expression(italic("Killed-CM")), expression(italic("Live-CM"))), name = "Treatment") +
  theme_classic(base_size = 10) +
  labs(y= "Adj. beam breaks",
       x = "Norm. C. minuta") 



Promethion_activity_MF_Cmin %>%
  ggplot(aes(x= qPCR_Cmin_per_gCC ,y=Distance_traveled_residuals)) +
  geom_smooth(method = "lm", se = F,  alpha = 0.8, size = 0.5, color = "black")+ 
  geom_point(aes(shape = Sex, color = Category), alpha =0.7, size =0.75, show.legend = T) +
  scale_shape_manual(values=shape_Sex, label = c("Female", "Male"),name = "Sex") + 
  scale_color_manual(values=color_Category, label = c(expression(italic("Killed-CM")), expression(italic("Live-CM"))), name = "Treatment") +
  theme_classic(base_size = 10) +
  labs(y= "Adj. distance traveled", 
       x = "Norm. C. minuta") +
   theme(strip.background = element_blank(),
        strip.text = element_blank()) +
  facet_wrap(.~Sex, scales = "free", ncol =1) 

set.seed(710)

Promethion_activity_MF_Cmin.2 <- Promethion_activity_MF_Cmin %>%
  tidyr::drop_na(qPCR_Cmin_per_gCC) %>%
  dplyr::mutate(qPCR_Cmin_per_gCC_norm = predict(bestNormalize(qPCR_Cmin_per_gCC)))

model_bb_cmin<-(lmer(Beam_breaks ~ qPCR_Cmin_per_gCC_norm*Sex + qPCR_Round + (1 |Batch/Sex/Promethion_Cabinet) + (1 |Batch:Promethion_Cabinet) + (1 |Promethion_Cabinet), Promethion_activity_MF_Cmin.2))
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -3.3e-03
lmerTest::step(model_bb_cmin)
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvaluesWarning: Model failed to converge with 1 negative eigenvalue: -4.8e-04boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvaluesWarning: Model failed to converge with 1 negative eigenvalue: -4.2e-04Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvaluesWarning: Model failed to converge with 1 negative eigenvalue: -4.2e-04
Backward reduced random-effect table:

                                     Eliminated npar  logLik    AIC     LRT Df Pr(>Chisq)    
<none>                                            11 -2012.6 4047.2                          
(1 | Promethion_Cabinet:(Sex:Batch))          1   10 -2012.6 4045.2  0.0000  1     1.0000    
(1 | Promethion_Cabinet)                      2    9 -2012.6 4043.2  0.0000  1     1.0000    
(1 | Sex:Batch)                               3    8 -2012.6 4041.2  0.0000  1     1.0000    
(1 | Batch:Promethion_Cabinet)                4    7 -2013.2 4040.5  1.2422  1     0.2651    
(1 | Batch)                                   0    6 -2028.2 4068.4 29.9631  1  4.404e-08 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Backward reduced fixed-effect table:
Degrees of freedom method: Satterthwaite 

                           Eliminated     Sum Sq    Mean Sq NumDF   DenDF F value  Pr(>F)  
qPCR_Cmin_per_gCC_norm:Sex          1    1144708    1144708     1 175.564  0.0029 0.95725  
qPCR_Round                          2  529054745  529054745     1  12.972  1.3388 0.26810  
qPCR_Cmin_per_gCC_norm              0 1871160245 1871160245     1 177.686  4.7537 0.03055 *
Sex                                 0 2365731335 2365731335     1   9.706  6.0102 0.03484 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
Beam_breaks ~ qPCR_Cmin_per_gCC_norm + Sex + (1 | Batch)
model_distance_cmin<-(lmer(Distance_traveled ~ qPCR_Cmin_per_gCC_norm*Sex + qPCR_Round + (1 |Batch/Sex/Promethion_Cabinet) + (1 |Batch:Promethion_Cabinet) + (1 |Promethion_Cabinet), Promethion_activity_MF_Cmin.2))
boundary (singular) fit: see help('isSingular')
lmerTest::step(model_distance_cmin)
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -4.2e-03boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -4.2e-03boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -3.7e-01boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -3.3e-04Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvaluesWarning: Model failed to converge with 1 negative eigenvalue: -9.6e-05Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvaluesWarning: Model failed to converge with 1 negative eigenvalue: -9.6e-05
Backward reduced random-effect table:

                                     Eliminated npar  logLik    AIC     LRT Df Pr(>Chisq)    
<none>                                            11 -1072.6 2167.2                          
(1 | Promethion_Cabinet:(Sex:Batch))          1   10 -1072.6 2165.2  0.0000  1     1.0000    
(1 | Promethion_Cabinet)                      2    9 -1072.6 2163.2  0.0000  1     1.0000    
(1 | Sex:Batch)                               3    8 -1072.6 2161.2  0.0000  1     0.9999    
(1 | Batch:Promethion_Cabinet)                4    7 -1072.9 2159.8  0.6783  1     0.4102    
(1 | Batch)                                   0    6 -1087.7 2187.4 29.5386  1  5.481e-08 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Backward reduced fixed-effect table:
Degrees of freedom method: Satterthwaite 

                           Eliminated Sum Sq Mean Sq NumDF   DenDF F value  Pr(>F)  
qPCR_Cmin_per_gCC_norm:Sex          1  13717   13717     1 175.348  1.5059 0.22141  
qPCR_Cmin_per_gCC_norm              2    222     222     1 173.631  0.0242 0.87662  
qPCR_Round                          3  17309   17309     1  11.898  1.8993 0.19352  
Sex                                 0  48172   48172     1  10.118  5.3086 0.04367 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
Distance_traveled ~ Sex + (1 | Batch)

-> association between beam breaks and C. minuta for both sexes -> for distance traveled there might be only an association in males –> separate analysis #### Beam breaks ~ C. minuta

model_bb_cmin.2<-(lmer(Beam_breaks ~ qPCR_Cmin_per_gCC_norm + Sex + (1 | Batch), Promethion_activity_MF_Cmin.2))
shapiro.test(residuals(model_bb_cmin.2))

    Shapiro-Wilk normality test

data:  residuals(model_bb_cmin.2)
W = 0.98947, p-value = 0.2015
anova(lm(residuals(model_bb_cmin.2)~fitted.values(model_bb_cmin.2)))
Analysis of Variance Table

Response: residuals(model_bb_cmin.2)
                                Df     Sum Sq   Mean Sq F value Pr(>F)
fitted.values(model_bb_cmin.2)   1 2.2116e+08 221163295  0.5962  0.441
Residuals                      179 6.6399e+10 370944778               
car::Anova(model_bb_cmin.2, type ="II", test.statistic="F")
Analysis of Deviance Table (Type II Wald F tests with Kenward-Roger df)

Response: Beam_breaks
                            F Df Df.res  Pr(>F)  
qPCR_Cmin_per_gCC_norm 4.6652  1 177.69 0.03212 *
Sex                    6.0101  1   9.91 0.03437 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
set.seed(765)
r2_model_bb_cmin_mar<- partR2(model_bb_cmin.2, partvars = c("qPCR_Cmin_per_gCC_norm"), 
                  R2_type = "marginal", nboot = 10)

  |                                                  | 0 % ~calculating  
  |+++++                                             | 10% ~01s          
  |++++++++++                                        | 20% ~01s          
  |+++++++++++++++                                   | 30% ~01s          
  |++++++++++++++++++++                              | 40% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++++++                    | 60% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
r2_model_bb_cmin_mar$R2 %>% dplyr::filter(term == "qPCR_Cmin_per_gCC_norm") %>% dplyr::select(estimate) %>% pull()
[1] 0.01843388
model_bb_cmin.resid<-(lmer(Beam_breaks ~ Sex + (1 | Batch), Promethion_activity_MF_Cmin.2))

Promethion_activity_MF_Cmin.2 <- Promethion_activity_MF_Cmin.2 %>% 
  dplyr::mutate(Beam_breaks_cmin_resid = residuals(model_bb_cmin.resid)/sigma(model_bb_cmin.resid))

Fig2_bb_cmin <- Promethion_activity_MF_Cmin.2 %>%
  ggplot(aes(x= qPCR_Cmin_per_gCC_norm ,y=Beam_breaks_cmin_resid)) +
  geom_smooth(method = "lm", se = F,  alpha = 0.8, size = 0.5, color = "black")+ 
  geom_point(aes(shape = Sex, color = Category), alpha =0.7, size =0.75, show.legend = T) +
  scale_shape_manual(values=shape_Sex, label = c("Female", "Male"),name = "Sex") + 
  scale_color_manual(values=color_Category, label = c(expression(italic("Killed-CM")), expression(italic("Live-CM"))), name = "Treatment") +
  theme_classic(base_size = 10) +
  labs(y= "Adj. beam breaks",
       x = "Norm. C. minuta")
Fig2_bb_cmin

Distance traveled ~ C. minuta

Promethion_activity_M2 <- Promethion_activity_MF_Cmin.2 %>%
  dplyr::filter(Sex =="M") %>%
  dplyr::mutate( Batch_Promethion_Cabinet = paste( Batch, Promethion_Cabinet, sep ="_"))
Promethion_activity_F2 <- Promethion_activity_MF_Cmin.2 %>%
  dplyr::filter(Sex =="F")%>%
  dplyr::mutate( Batch_Promethion_Cabinet = paste( Batch, Promethion_Cabinet, sep ="_"))

model_distance_cmin_m<- lmer(Distance_traveled_norm ~ qPCR_Cmin_per_gCC_norm + (1 | Batch_Promethion_Cabinet), Promethion_activity_M2)
model_distance_cmin_f<- lmer(Distance_traveled_norm ~ qPCR_Cmin_per_gCC_norm + (1 | Batch_Promethion_Cabinet), Promethion_activity_F2)

shapiro.test(residuals(model_distance_cmin_m))

    Shapiro-Wilk normality test

data:  residuals(model_distance_cmin_m)
W = 0.98454, p-value = 0.3809
anova(lm(residuals(model_distance_cmin_m)~fitted.values(model_distance_cmin_m)))
Analysis of Variance Table

Response: residuals(model_distance_cmin_m)
                                     Df Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_distance_cmin_m)  1  0.713 0.71289   1.933  0.168
Residuals                            86 31.717 0.36880               
shapiro.test(residuals(model_distance_cmin_f))

    Shapiro-Wilk normality test

data:  residuals(model_distance_cmin_f)
W = 0.97406, p-value = 0.0606
anova(lm(residuals(model_distance_cmin_f)~fitted.values(model_distance_cmin_f)))
Analysis of Variance Table

Response: residuals(model_distance_cmin_f)
                                     Df Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_distance_cmin_f)  1  1.377 1.37658  2.3408 0.1295
Residuals                            91 53.515 0.58808               
plot(model_distance_cmin_m)

plot(model_distance_cmin_f)

car::Anova(model_distance_cmin_m, test.statistic ="F")
Analysis of Deviance Table (Type II Wald F tests with Kenward-Roger df)

Response: Distance_traveled_norm
                            F Df Df.res Pr(>F)  
qPCR_Cmin_per_gCC_norm 4.3941  1 80.592 0.0392 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
car::Anova(model_distance_cmin_f, test.statistic ="F")
Analysis of Deviance Table (Type II Wald F tests with Kenward-Roger df)

Response: Distance_traveled_norm
                            F Df Df.res Pr(>F)
qPCR_Cmin_per_gCC_norm 0.1132  1   90.3 0.7374
#r2 males
r2_model_distance_cmin_m_mar<- partR2(model_distance_cmin_m, partvars = c("qPCR_Cmin_per_gCC_norm"), 
                  R2_type = "marginal", nboot = 10)

  |                                                  | 0 % ~calculating  
  |+++++                                             | 10% ~01s          
  |++++++++++                                        | 20% ~01s          
  |+++++++++++++++                                   | 30% ~01s          
  |++++++++++++++++++++                              | 40% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++++++                    | 60% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
r2_model_distance_cmin_m_mar$R2 %>% dplyr::filter(term == "qPCR_Cmin_per_gCC_norm") %>% dplyr::select(estimate) %>% pull()
[1] 0.03734531
#r2 females
r2_model_distance_cmin_f_mar<- partR2(model_distance_cmin_f, partvars = c("qPCR_Cmin_per_gCC_norm"), 
                  R2_type = "marginal", nboot = 10)

  |                                                  | 0 % ~calculating  
  |+++++                                             | 10% ~02s          
  |++++++++++                                        | 20% ~01s          
  |+++++++++++++++                                   | 30% ~01s          
  |++++++++++++++++++++                              | 40% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++++++                    | 60% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
r2_model_distance_cmin_f_mar$R2 %>% dplyr::filter(term == "qPCR_Cmin_per_gCC_norm") %>% dplyr::select(estimate) %>% pull()
[1] 0.001360038
model_distance_cmin.resid_M<-(lmer(Distance_traveled_norm ~ + (1 | Batch:Promethion_Cabinet), Promethion_activity_M2))
model_distance_cmin.resid_F<-(lmer(Distance_traveled_norm ~ + (1 | Batch:Promethion_Cabinet), Promethion_activity_F2))

Promethion_activity_M2 <- Promethion_activity_M2 %>% 
  dplyr::mutate(Distance_traveled_cmin_resid = residuals(model_distance_cmin.resid_M)/sigma(model_distance_cmin.resid_M))
Promethion_activity_F2 <- Promethion_activity_F2 %>% 
  dplyr::mutate(Distance_traveled_cmin_resid = residuals(model_distance_cmin.resid_F)/sigma(model_distance_cmin.resid_F))

Promethion_activity_MF3 <- rbind(Promethion_activity_M2, Promethion_activity_F2)


Fig2_distance_cmin<- Promethion_activity_MF3 %>%
  ggplot(aes(x= qPCR_Cmin_per_gCC_norm ,y=Distance_traveled_cmin_resid)) +
  geom_smooth(method = "lm", se = F,  alpha = 0.8, size = 0.5, color = "black")+ 
  geom_point(aes(shape = Sex, color = Category), alpha =0.7, size =0.75, show.legend = T) +
  scale_shape_manual(values=shape_Sex, label = c("Female", "Male"),name = "Sex") + 
  scale_color_manual(values=color_Category, label = c(expression(italic("Killed-CM")), expression(italic("Live-CM"))), name = "Treatment") +
  theme_classic(base_size = 10) +
  labs(y= "Adj. distance traveled", 
       x = "Norm. C. minuta") +
   theme(strip.background = element_blank(),
        strip.text = element_blank()) +
  facet_wrap(.~Sex, scales = "free", ncol =1) 
Fig2_distance_cmin

Correlate activity to feed efficiency

Promethion_activity_food <- Promethion_Food %>%
  dplyr::select(MouseID, Feed_eficiency) %>%
  dplyr::left_join(Promethion_activity, by = "MouseID") %>%
  tidyr::drop_na(Feed_eficiency, Beam_breaks)

Promethion_activity_food %>%
  ggplot(aes(x= Beam_breaks ,y=Feed_eficiency)) +
  geom_smooth(method = "lm", se = F, alpha = 0.8, size = 0.5)+ 
  geom_point(aes(shape = Sex, color = Category), alpha =0.7, size =0.5, show.legend = T) +
  scale_shape_manual(values=shape_Sex, label = c("Female", "Male"),name = "Sex") + 
  scale_color_manual(values=color_Category, label = c(expression(italic("Killed-CM")), expression(italic("Live-CM"))), name = "Treatment") +
  theme_classic(base_size = 10) 


Promethion_activity_food %>%
  ggplot(aes(x= Distance_traveled ,y=Feed_eficiency)) +
  geom_smooth(method = "lm", se = F, alpha = 0.8, size = 0.5)+ 
  geom_point(aes(shape = Sex, color = Category), alpha =0.7, size =0.5, show.legend = T) +
  scale_shape_manual(values=shape_Sex, label = c("Female", "Male"),name = "Sex") + 
  scale_color_manual(values=color_Category, label = c(expression(italic("Killed-CM")), expression(italic("Live-CM"))), name = "Treatment") +
  theme_classic(base_size = 10) +
  facet_grid(.~Sex)

options(contrasts=c("contr.sum", "contr.poly"))

model_fe_bb <- lmer(Feed_eficiency~ Beam_breaks*Sex + (1|Batch), Promethion_activity_food)
Warning: Some predictor variables are on very different scales: consider rescalingWarning: Some predictor variables are on very different scales: consider rescaling
step(model_fe_bb)
Warning: Some predictor variables are on very different scales: consider rescalingWarning: Some predictor variables are on very different scales: consider rescalingWarning: Some predictor variables are on very different scales: consider rescalingWarning: Some predictor variables are on very different scales: consider rescaling
Backward reduced random-effect table:

            Eliminated npar logLik     AIC    LRT Df Pr(>Chisq)    
<none>                    6 583.97 -1155.9                         
(1 | Batch)          0    5 577.26 -1144.5 13.411  1  0.0002501 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Backward reduced fixed-effect table:
Degrees of freedom method: Satterthwaite 

                Eliminated     Sum Sq    Mean Sq NumDF   DenDF F value Pr(>F)
Beam_breaks:Sex          1 7.7590e-05 7.7590e-05     1 160.461  2.5052 0.1154
Sex                      2 3.5060e-06 3.5060e-06     1   9.984  0.1137 0.7429
Beam_breaks              3 1.6137e-05 1.6137e-05     1 156.667  0.5237 0.4703

Model found:
Feed_eficiency ~ (1 | Batch)
model_fe_distance <- lmer(Feed_eficiency~ Distance_traveled*Sex + (1|Batch), Promethion_activity_food)
step(model_fe_distance)
Backward reduced random-effect table:

            Eliminated npar logLik     AIC    LRT Df Pr(>Chisq)    
<none>                    6 595.94 -1179.9                         
(1 | Batch)          0    5 587.54 -1165.1 16.792  1  4.171e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Backward reduced fixed-effect table:
Degrees of freedom method: Satterthwaite 

                      Eliminated     Sum Sq    Mean Sq NumDF  DenDF F value  Pr(>F)  
Distance_traveled:Sex          0 0.00014076 0.00014076     1 163.78  4.5929 0.03358 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
Feed_eficiency ~ Distance_traveled * Sex + (1 | Batch)
set.seed(673)
Promethion_activity_food$Feed_eficiency_norm <- predict(bestNormalize(Promethion_activity_food$Feed_eficiency))

model_fe_bb.2 <- lmer(Feed_eficiency_norm~ Beam_breaks + (1|Batch), Promethion_activity_food)
Warning: Some predictor variables are on very different scales: consider rescalingWarning: Some predictor variables are on very different scales: consider rescaling
shapiro.test(residuals(model_fe_bb.2))

    Shapiro-Wilk normality test

data:  residuals(model_fe_bb.2)
W = 0.99334, p-value = 0.6357
anova(lm(residuals(model_fe_bb.2)~fitted.values(model_fe_bb.2)))
Analysis of Variance Table

Response: residuals(model_fe_bb.2)
                              Df  Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_fe_bb.2)   1   1.249 1.24913   1.807 0.1807
Residuals                    167 115.445 0.69129               
options(contrasts=c("contr.sum", "contr.poly"))
car::Anova(model_fe_bb.2, type ="II", test.statistic ="F")
Analysis of Deviance Table (Type II Wald F tests with Kenward-Roger df)

Response: Feed_eficiency_norm
                 F Df Df.res Pr(>F)
Beam_breaks 0.3749  1 160.05 0.5412
r2_model_fe_bb_mar<- partR2(model_fe_bb.2, partvars = c("Beam_breaks"), 
                  R2_type = "marginal", nboot = 10)

  |                                                  | 0 % ~calculating  
  |+++++                                             | 10% ~01s          
  |++++++++++                                        | 20% ~01s          
  |+++++++++++++++                                   | 30% ~01s          
  |++++++++++++++++++++                              | 40% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++++++                    | 60% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
r2_model_fe_bb_mar$R2 %>% dplyr::filter(term == "Beam_breaks") %>% dplyr::select(estimate) %>% pull()
[1] 0.002815192
model_fe_bb_resid <- lmer(Feed_eficiency_norm~ (1|Batch), Promethion_activity_food)

Promethion_activity_food <- Promethion_activity_food %>%
  dplyr::mutate(Feed_eficiency_bb_resid = residuals(model_fe_bb_resid)/sigma(model_fe_bb_resid))

Fig2_bb_fe <- Promethion_activity_food %>%
  ggplot(aes(x= (Beam_breaks/100000) ,y=Feed_eficiency_bb_resid))+
  geom_smooth(method = "lm", se = F,  alpha = 0.8, size = 0.5, color = "black")+ 
  geom_point(aes(color= Category, shape = Sex), alpha =0.7, size =0.75, show.legend = T) +
  scale_shape_manual(values=shape_Sex, label = c("Female", "Male"),name = "Sex") + 
  scale_color_manual(values=color_Category, label = c(expression(italic("Killed-CM")), expression(italic("Live-CM"))), name = "Treatment") +
  labs(y="Adj. feed efficiency", x=expression(paste("Beam breaks (Nr) x ",e^5))) +
  theme_classic(base_size = 10) +
   theme(strip.background = element_blank(),
        strip.text = element_blank()) 
Fig2_bb_fe

Seperate models for each sex for Fe ~ distance

set.seed(673)
Promethion_activity_food_M <- Promethion_activity_food %>%
  dplyr::filter(Sex =="M")  %>%
  dplyr::mutate(Feed_eficiency_norm = predict(bestNormalize(Feed_eficiency)))

Promethion_activity_food_F <- Promethion_activity_food  %>%
  dplyr::filter(Sex =="F")  %>%
  dplyr::mutate(Feed_eficiency_norm = predict(bestNormalize(Feed_eficiency)))

model_fe_distance_m <- lmer(Feed_eficiency_norm~ Distance_traveled + (1|Batch), Promethion_activity_food_M)
model_fe_distance_f <- lmer(Feed_eficiency_norm~ Distance_traveled + (1|Batch), Promethion_activity_food_F)

shapiro.test(residuals(model_fe_distance_m))

    Shapiro-Wilk normality test

data:  residuals(model_fe_distance_m)
W = 0.99171, p-value = 0.8751
shapiro.test(residuals(model_fe_distance_f))

    Shapiro-Wilk normality test

data:  residuals(model_fe_distance_f)
W = 0.98873, p-value = 0.6757
anova(lm(residuals(model_fe_distance_m)~fitted.values(model_fe_distance_m)))
Analysis of Variance Table

Response: residuals(model_fe_distance_m)
                                   Df Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_fe_distance_m)  1  1.030 1.02994  1.2525 0.2663
Residuals                          82 67.427 0.82228               
anova(lm(residuals(model_fe_distance_f)~fitted.values(model_fe_distance_f)))
Analysis of Variance Table

Response: residuals(model_fe_distance_f)
                                   Df Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_fe_distance_f)  1  0.337 0.33706  0.5269 0.4699
Residuals                          83 53.093 0.63968               
car::Anova(model_fe_distance_m, test.statistic ="F", type ="II")
Analysis of Deviance Table (Type II Wald F tests with Kenward-Roger df)

Response: Feed_eficiency_norm
                       F Df Df.res  Pr(>F)  
Distance_traveled 2.8518  1 77.557 0.09529 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
car::Anova(model_fe_distance_f, test.statistic ="F", type ="II")
Analysis of Deviance Table (Type II Wald F tests with Kenward-Roger df)

Response: Feed_eficiency_norm
                       F Df Df.res Pr(>F)
Distance_traveled 1.3974  1 82.996 0.2405
#r2 males
r2_model_fe_distance_m_mar<- partR2(model_fe_distance_m, partvars = c("Distance_traveled"), 
                  R2_type = "marginal", nboot = 10)

  |                                                  | 0 % ~calculating  
  |+++++                                             | 10% ~01s          
  |++++++++++                                        | 20% ~01s          
  |+++++++++++++++                                   | 30% ~01s          
  |++++++++++++++++++++                              | 40% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++++++                    | 60% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
r2_model_fe_distance_m_mar$R2 %>% dplyr::filter(term == "Distance_traveled") %>% dplyr::select(estimate) %>% pull()
[1] 0.03953071
#r2 females
r2_model_fe_distance_f_mar<- partR2(model_fe_distance_f, partvars = c("Distance_traveled"), 
                  R2_type = "marginal", nboot = 10)

  |                                                  | 0 % ~calculating  
  |+++++                                             | 10% ~02s          
  |++++++++++                                        | 20% ~01s          
  |+++++++++++++++                                   | 30% ~01s          
  |++++++++++++++++++++                              | 40% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++++++                    | 60% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
r2_model_fe_distance_f_mar$R2 %>% dplyr::filter(term == "Distance_traveled") %>% dplyr::select(estimate) %>% pull()
[1] 0.01671485
model_fe_allm_m_resid <- lmer(Feed_eficiency_norm~  (1|Batch), Promethion_activity_food_M)
model_fe_allm_f_resid <- lmer(Feed_eficiency_norm~  (1|Batch), Promethion_activity_food_F)

Promethion_activity_food_M <- Promethion_activity_food_M %>%
  dplyr::mutate(Feed_eficiency_distance_resid = residuals(model_fe_allm_m_resid)/sigma(model_fe_allm_m_resid))
Promethion_activity_food_F <- Promethion_activity_food_F %>%
  dplyr::mutate(Feed_eficiency_distance_resid = residuals(model_fe_allm_f_resid)/sigma(model_fe_allm_f_resid))

Promethion_activity_food_MF <- rbind(Promethion_activity_food_M, Promethion_activity_food_F)


Fig2_fe_distance <- Promethion_activity_food_MF %>%
  ggplot(aes(x= (Distance_traveled/1000) ,y=Feed_eficiency_distance_resid))+
  geom_smooth(method = "lm", se = F,  alpha = 0.8, size = 0.5, color = "black")+ 
  geom_point(aes(color= Category, shape = Sex), alpha =0.7, size =0.75, show.legend = T) +
  scale_shape_manual(values=shape_Sex, label = c("Female", "Male"),name = "Sex") + 
  scale_color_manual(values=color_Category, label = c(expression(italic("Killed-CM")), expression(italic("Live-CM"))), name = "Treatment") +
  labs(y="Adj. feed efficiency", x="Distance traveled (km)") +
  theme_classic(base_size = 10) +
  facet_wrap(.~Sex, scales = "free", ncol =1) + 
   theme(strip.background = element_blank(),
        strip.text = element_blank()) 
Fig2_fe_distance

Energy expenditure

Fig2_ee_weight<- Promethion_activity_ee %>%
  ggplot(aes(x= Promethion_weight ,y=EE_average_per_hour, color= Category, group = Category)) +
  geom_smooth(method = "lm", se = F,  alpha = 0.8, size = 0.5)+ 
  geom_point(aes(shape = Sex), alpha =0.7, size =0.75, show.legend = T) +
  scale_shape_manual(values=shape_Sex, label = c("Female", "Male"),name = "Sex") + 
  scale_color_manual(values=color_Category, label = c(expression(italic("Killed-CM")), expression(italic("Live-CM"))), name = "Treatment") +
  theme_classic(base_size = 10) +
  labs(y = "Energy expenditure (kcal/h)", x = "Weight (g)") +
  facet_wrap(.~Sex, scales = "free", ncol =1) + 
  theme(strip.background = element_blank(),
   strip.text = element_blank()) 
Fig2_ee_weight

set.seed(719) 

Promethion_activity_ee.2 <- Promethion_activity_ee %>%
  drop_na(Promethion_weight)

Promethion_activity_ee.2$Promethion_weight_norm <- predict(bestNormalize(Promethion_activity_ee.2$Promethion_weight))
Promethion_activity_ee.2$EE_average_per_hour_norm<- predict(bestNormalize(Promethion_activity_ee.2$EE_average_per_hour))

options(contrasts=c("contr.sum", "contr.poly"))

model_ee<-(lmer(EE_average_per_hour_norm ~ Category*Sex + Sex*Promethion_weight_norm  + (Category |Batch/Sex/Promethion_Cabinet), Promethion_activity_ee.2))
boundary (singular) fit: see help('isSingular')
step(model_ee, keep ="Category")
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -5.0e-03boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -1.3e-04boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
Backward reduced random-effect table:

                                                        Eliminated npar  logLik    AIC     LRT Df Pr(>Chisq)    
<none>                                                               16 -199.44 430.87                          
Category in (Category | Sex:Batch)                               1   14 -199.44 426.87  0.0000  2     1.0000    
(1 | Sex:Batch)                                                  2   13 -199.44 424.87  0.0000  1     1.0000    
Category in (Category | Promethion_Cabinet:(Sex:Batch))          3   11 -199.59 421.18  0.3045  2     0.8588    
Category in (Category | Batch)                                   4    9 -199.74 417.49  0.3097  2     0.8566    
(1 | Promethion_Cabinet:(Sex:Batch))                             5    8 -200.34 416.69  1.2039  1     0.2725    
(1 | Batch)                                                      0    7 -210.59 435.17 20.4843  1  6.012e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Backward reduced fixed-effect table:
Degrees of freedom method: Satterthwaite 

                           Eliminated Sum Sq Mean Sq NumDF   DenDF F value    Pr(>F)    
Sex:Promethion_weight_norm          1  0.007   0.007     1 165.965  0.0150    0.9027    
Category:Sex                        2  1.232   1.232     1 163.665  2.6868    0.1031    
Sex                                 3  0.378   0.378     1  16.250  0.8158    0.3796    
Category                            0  0.513   0.513     1 164.893  1.1067    0.2943    
Promethion_weight_norm              0 37.292  37.292     1  80.475 80.5037 9.491e-14 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
EE_average_per_hour_norm ~ Category + Promethion_weight_norm + (1 | Batch)
options(contrasts=c("contr.sum", "contr.poly"))
model_ee.2<-(lmer(EE_average_per_hour ~ Category*Sex + Promethion_weight + (1 | Batch), Promethion_activity_ee.2))
stats::shapiro.test(resid(model_ee.2))

    Shapiro-Wilk normality test

data:  resid(model_ee.2)
W = 0.98823, p-value = 0.1453
anova(lm(residuals(model_ee.2)~fitted.values(model_ee.2)))
Analysis of Variance Table

Response: residuals(model_ee.2)
                           Df   Sum Sq    Mean Sq F value Pr(>F)
fitted.values(model_ee.2)   1 0.000246 0.00024649  0.3533  0.553
Residuals                 176 0.122793 0.00069769               
Promethion_activity_ee.2_M <- Promethion_activity_ee.2 %>% dplyr::filter(Sex =="M")
Promethion_activity_ee.2_F <- Promethion_activity_ee.2 %>% dplyr::filter(Sex =="F")

model_ee.M<-(lmer(EE_average_per_hour ~ Category + Promethion_weight + (1 | Batch), Promethion_activity_ee.2_M))
model_ee.F<-(lmer(EE_average_per_hour ~ Category + Promethion_weight + (1 | Batch), Promethion_activity_ee.2_F))

shapiro.test(residuals(model_ee.M))

    Shapiro-Wilk normality test

data:  residuals(model_ee.M)
W = 0.9812, p-value = 0.2378
shapiro.test(residuals(model_ee.F))

    Shapiro-Wilk normality test

data:  residuals(model_ee.F)
W = 0.98739, p-value = 0.5334
aov(lm(residuals(model_ee.M)~fitted.values(model_ee.M)))
Call:
   aov(formula = lm(residuals(model_ee.M) ~ fitted.values(model_ee.M)))

Terms:
                fitted.values(model_ee.M)  Residuals
Sum of Squares                 0.00021583 0.06038527
Deg. of Freedom                         1         85

Residual standard error: 0.02665361
Estimated effects may be unbalanced
aov(lm(residuals(model_ee.F)~fitted.values(model_ee.F)))
Call:
   aov(formula = lm(residuals(model_ee.F) ~ fitted.values(model_ee.F)))

Terms:
                fitted.values(model_ee.F)  Residuals
Sum of Squares                 0.00014060 0.06272214
Deg. of Freedom                         1         89

Residual standard error: 0.026547
Estimated effects may be unbalanced
car::Anova(model_ee.M, test.statistic ="F", type ="II")
Analysis of Deviance Table (Type II Wald F tests with Kenward-Roger df)

Response: EE_average_per_hour
                        F Df Df.res    Pr(>F)    
Category           0.1824  1 79.391    0.6705    
Promethion_weight 31.1667  1 72.787 3.847e-07 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
car::Anova(model_ee.F, test.statistic ="F", type ="II")
Analysis of Deviance Table (Type II Wald F tests with Kenward-Roger df)

Response: EE_average_per_hour
                        F Df Df.res    Pr(>F)    
Category           3.5387  1 83.064   0.06346 .  
Promethion_weight 31.5606  1 87.220 2.271e-07 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
effects::effect("Category", mod = model_ee.M, se =TRUE) %>% as.data.frame()
effects::effect("Category", mod = model_ee.F, se =TRUE) %>% as.data.frame()
model_ee_residuals_M <-(lmer(EE_average_per_hour ~ Promethion_weight + (1 | Batch) , Promethion_activity_ee.2_M)) 
Promethion_activity_ee.2_M$EE_average_per_hour_residual <- residuals(model_ee_residuals_M)/sigma(model_ee_residuals_M)

model_ee_residuals_F <-(lmer(EE_average_per_hour ~  Promethion_weight + (1 | Batch) , Promethion_activity_ee.2_F)) 
Promethion_activity_ee.2_F$EE_average_per_hour_residual <- residuals(model_ee_residuals_F)/sigma(model_ee_residuals_F)

Promethion_activity_ee.2_MF <- rbind(Promethion_activity_ee.2_M, Promethion_activity_ee.2_F)

Fig2_ee_resid <- Promethion_activity_ee.2_MF %>%
  ggplot(aes(x = Category, y = EE_average_per_hour_residual, shape = Sex, color = Category)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Category), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_Category, label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Killed" = "Killed-\nCM", "Live" = "Live-\nCM")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  labs(y = "Adj. energy expenditure") +
  facet_wrap(.~Sex, scales = "free_y", ncol =1) + 
  theme(strip.background = element_blank(),
   strip.text = element_blank()) +
  theme(axis.title.x=element_blank()) +
  theme(axis.text.x = element_text(face = "italic")) 
Fig2_ee_resid

Circadian

# Resting metabolic rate (RMR) for each cycle
Circadian_RMR_all <- Circadian.2 %>%
  dplyr::arrange(StartDate_common, desc(Cycle)) %>%
  dplyr::group_by(MouseID) %>%
  dplyr::summarise(All_RMR =mean(QR_EE_30)) %>%
  #dplyr::filter(Day == 3 & Cycle == 0) %>%
  dplyr::select(MouseID, All_RMR)%>%
  dplyr::ungroup()
Circadian_RMR_dark <- Circadian.2 %>% 
  dplyr::filter(Cycle == 0)  %>% # 0 = dark cycle = activity period of mice (nocturnal)
  dplyr::arrange(StartDate_common, desc(Cycle)) %>%
  dplyr::group_by(MouseID) %>%
  dplyr::summarise(Dark_RMR =mean(QR_EE_30))%>%
  #dplyr::filter(Day == 3) %>%
  dplyr::select(MouseID, Dark_RMR)%>%
  dplyr::ungroup()
Circadian_RMR_light <- Circadian.2 %>% 
  dplyr::filter(Cycle == 1)  %>% # 1 = light cycle = resting period of mice (nocturnal)
  dplyr::arrange(StartDate_common, desc(Cycle)) %>%
  dplyr::group_by(MouseID) %>%
  dplyr::summarise(Light_RMR =mean(QR_EE_30)) %>%
  #dplyr::filter(Day == 3) %>%
  dplyr::select(MouseID, Light_RMR)%>%
  dplyr::ungroup()

Circadian_RMR <- Circadian_RMR_all %>%
  dplyr::left_join(Circadian_RMR_dark, by ="MouseID") %>% 
  dplyr::left_join(Circadian_RMR_light, by ="MouseID") %>% 
  dplyr::left_join(metadata, by =c("MouseID")) %>%
  tidyr::drop_na(Promethion_weight)
  
set.seed(612)
options(contrasts=c("contr.sum", "contr.poly"))


Circadian_RMR$All_RMR_norm<- predict(bestNormalize::log_x(Circadian_RMR$All_RMR))
Circadian_RMR$Dark_RMR_norm<- predict(bestNormalize::log_x(Circadian_RMR$Dark_RMR))
Circadian_RMR$Light_RMR_norm<- predict(bestNormalize::log_x(Circadian_RMR$Light_RMR))
Circadian_RMR$Promethion_weight_norm<- predict(bestNormalize(Circadian_RMR$Promethion_weight))

Circadian_RMR_M <- Circadian_RMR %>% dplyr::filter(Sex == "M")
Circadian_RMR_F <- Circadian_RMR %>% dplyr::filter(Sex == "F")

model_rmr_all_m<-(lmer(All_RMR_norm ~ Category+ Promethion_weight_norm + (1 |Batch/Promethion_Cabinet), Circadian_RMR_M))
boundary (singular) fit: see help('isSingular')
model_rmr_dark_m<-(lmer(Dark_RMR_norm ~ Category+ Promethion_weight_norm + (1 |Batch/Promethion_Cabinet), Circadian_RMR_M))
boundary (singular) fit: see help('isSingular')
model_rmr_light_m<-(lmer(Light_RMR_norm ~ Category+ Promethion_weight_norm + (1 |Batch/Promethion_Cabinet), Circadian_RMR_M))
boundary (singular) fit: see help('isSingular')
model_rmr_all_f<-(lmer(All_RMR_norm ~ Category+ Promethion_weight_norm + (1 |Batch/Promethion_Cabinet), Circadian_RMR_F))
boundary (singular) fit: see help('isSingular')
model_rmr_dark_f<-(lmer(Dark_RMR_norm ~ Category+ Promethion_weight_norm + (1 |Batch/Promethion_Cabinet), Circadian_RMR_F))
boundary (singular) fit: see help('isSingular')
model_rmr_light_f<-(lmer(Light_RMR_norm ~ Category+ Promethion_weight_norm + (1 |Batch/Promethion_Cabinet), Circadian_RMR_F))
boundary (singular) fit: see help('isSingular')
step(model_rmr_all_m)
boundary (singular) fit: see help('isSingular')
Backward reduced random-effect table:

                               Eliminated npar  logLik    AIC     LRT Df Pr(>Chisq)
<none>                                       6 -114.98 241.96                      
(1 | Batch)                             1    5 -114.98 239.96 0.00000  1     1.0000
(1 | Promethion_Cabinet:Batch)          2    4 -115.14 238.28 0.32139  1     0.5708

Backward reduced fixed-effect table:
                       Eliminated Df Sum of Sq    RSS     AIC F value  Pr(>F)  
Category                        1  1    0.7969 66.433 -19.465  1.0199 0.31545  
Promethion_weight_norm          0  1    3.2012 69.634 -17.371  4.0959 0.04613 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
All_RMR_norm ~ Promethion_weight_norm
step(model_rmr_dark_m)
boundary (singular) fit: see help('isSingular')
Backward reduced random-effect table:

                               Eliminated npar  logLik    AIC     LRT Df Pr(>Chisq)
<none>                                       6 -117.97 247.94                      
(1 | Batch)                             1    5 -117.97 245.94 0.00000  1     1.0000
(1 | Promethion_Cabinet:Batch)          2    4 -118.20 244.40 0.45317  1     0.5008

Backward reduced fixed-effect table:
                       Eliminated Df Sum of Sq    RSS     AIC F value Pr(>F)
Promethion_weight_norm          1  1   0.69057 71.280 -13.339  0.8218 0.3673
Category                        2  1   1.08876 72.369 -14.020  1.2983 0.2577

Model found:
Dark_RMR_norm ~ 1
step(model_rmr_light_m)
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
Backward reduced random-effect table:

                               Eliminated npar  logLik   AIC LRT Df Pr(>Chisq)
<none>                                       6 -123.35 258.7                  
(1 | Promethion_Cabinet:Batch)          1    5 -123.35 256.7   0  1          1
(1 | Batch)                             2    4 -123.35 254.7   0  1          1

Backward reduced fixed-effect table:
                       Eliminated Df Sum of Sq    RSS     AIC F value  Pr(>F)  
Category                        1  1    0.0673 79.867 -3.4425  0.0709 0.79075  
Promethion_weight_norm          0  1    5.7019 85.569  0.5569  6.0683 0.01578 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
Light_RMR_norm ~ Promethion_weight_norm
step(model_rmr_all_f)
Backward reduced random-effect table:

                               Eliminated npar  logLik    AIC    LRT Df Pr(>Chisq)    
<none>                                       6 -125.61 263.22                         
(1 | Promethion_Cabinet:Batch)          1    5 -125.61 261.22  0.000  1          1    
(1 | Batch)                             0    4 -133.39 274.79 15.562  1  7.982e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Backward reduced fixed-effect table:
Degrees of freedom method: Satterthwaite 

                       Eliminated Sum Sq Mean Sq NumDF  DenDF F value  Pr(>F)  
Category                        1 0.1508  0.1508     1 83.050  0.1911 0.66318  
Promethion_weight_norm          0 4.0853  4.0853     1 87.906  5.2239 0.02468 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
All_RMR_norm ~ Promethion_weight_norm + (1 | Batch)
step(model_rmr_dark_f)
Backward reduced random-effect table:

                               Eliminated npar  logLik    AIC    LRT Df Pr(>Chisq)    
<none>                                       6 -124.33 260.65                         
(1 | Promethion_Cabinet:Batch)          1    5 -124.33 258.65  0.000  1          1    
(1 | Batch)                             0    4 -133.52 275.03 18.382  1  1.807e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Backward reduced fixed-effect table:
Degrees of freedom method: Satterthwaite 

                       Eliminated Sum Sq Mean Sq NumDF  DenDF F value Pr(>F)
Category                        1 1.1493  1.1493     1 83.039  1.5101 0.2226
Promethion_weight_norm          2 1.9050  1.9050     1 88.546  2.4892 0.1182

Model found:
Dark_RMR_norm ~ (1 | Batch)
step(model_rmr_light_f)
boundary (singular) fit: see help('isSingular')
Backward reduced random-effect table:

                               Eliminated npar  logLik    AIC     LRT Df Pr(>Chisq)
<none>                                       6 -123.38 258.77                      
(1 | Promethion_Cabinet:Batch)          1    5 -123.38 256.77 0.00000  1     1.0000
(1 | Batch)                             2    4 -123.47 254.94 0.17612  1     0.6747

Backward reduced fixed-effect table:
                       Eliminated Df Sum of Sq    RSS     AIC F value   Pr(>F)   
Category                        0  1    9.0518 82.852 -4.5356  10.793 0.001464 **
Promethion_weight_norm          0  1    8.6658 82.466 -4.9605  10.333 0.001827 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
Light_RMR_norm ~ Category + Promethion_weight_norm
set.seed(149)

options(contrasts=c("contr.sum", "contr.poly"))
model_rmr_all_m2<-(lmer(All_RMR_norm ~ Category+ Promethion_weight_norm + (1 |Batch), Circadian_RMR_M))
boundary (singular) fit: see help('isSingular')
model_rmr_dark_m2<-(lmer(Dark_RMR_norm ~ Category+ Promethion_weight_norm + (1 |Batch), Circadian_RMR_M))
boundary (singular) fit: see help('isSingular')
model_rmr_light_m2<-(lmer(Light_RMR_norm ~ Category+ Promethion_weight_norm + (1 |Batch), Circadian_RMR_M))
boundary (singular) fit: see help('isSingular')
model_rmr_all_f2<-(lmer(All_RMR_norm ~ Category+ Promethion_weight_norm + (1 |Batch), Circadian_RMR_F))
model_rmr_dark_f2<-(lmer(Dark_RMR_norm ~ Category+ Promethion_weight_norm + (1 |Batch), Circadian_RMR_F))
model_rmr_light_f2<-(lmer(Light_RMR_norm ~ Category+ Promethion_weight_norm + (1 |Batch), Circadian_RMR_F))

shapiro.test(residuals(model_rmr_all_m2))

    Shapiro-Wilk normality test

data:  residuals(model_rmr_all_m2)
W = 0.97402, p-value = 0.07705
shapiro.test(residuals(model_rmr_dark_m2))

    Shapiro-Wilk normality test

data:  residuals(model_rmr_dark_m2)
W = 0.98664, p-value = 0.5151
shapiro.test(residuals(model_rmr_light_m2))

    Shapiro-Wilk normality test

data:  residuals(model_rmr_light_m2)
W = 0.97793, p-value = 0.1431
anova(lm(residuals(model_rmr_all_m2) ~ fitted.values(model_rmr_all_m2)))
Analysis of Variance Table

Response: residuals(model_rmr_all_m2)
                                Df Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_rmr_all_m2)  1  0.000 0.00000       0      1
Residuals                       85 65.636 0.77219               
anova(lm(residuals(model_rmr_dark_m2) ~ fitted.values(model_rmr_dark_m2)))
Analysis of Variance Table

Response: residuals(model_rmr_dark_m2)
                                 Df Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_rmr_dark_m2)  1  0.000 0.00000       0      1
Residuals                        85 70.589 0.83046               
anova(lm(residuals(model_rmr_light_m2) ~ fitted.values(model_rmr_light_m2)))
Analysis of Variance Table

Response: residuals(model_rmr_light_m2)
                                  Df Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_rmr_light_m2)  1    0.0 0.00000       0      1
Residuals                         85   79.8 0.93882               
shapiro.test(residuals(model_rmr_all_f2))

    Shapiro-Wilk normality test

data:  residuals(model_rmr_all_f2)
W = 0.98488, p-value = 0.376
shapiro.test(residuals(model_rmr_dark_f2))

    Shapiro-Wilk normality test

data:  residuals(model_rmr_dark_f2)
W = 0.98758, p-value = 0.5468
shapiro.test(residuals(model_rmr_light_f2))

    Shapiro-Wilk normality test

data:  residuals(model_rmr_light_f2)
W = 0.99356, p-value = 0.9414
anova(lm(residuals(model_rmr_all_f2) ~ fitted.values(model_rmr_all_f2)))
Analysis of Variance Table

Response: residuals(model_rmr_all_f2)
                                Df Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_rmr_all_f2)  1  0.326 0.32643  0.4416 0.5081
Residuals                       89 65.789 0.73921               
anova(lm(residuals(model_rmr_dark_f2) ~ fitted.values(model_rmr_dark_f2)))
Analysis of Variance Table

Response: residuals(model_rmr_dark_f2)
                                 Df Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_rmr_dark_f2)  1  0.318 0.31796  0.4467 0.5057
Residuals                        89 63.357 0.71187               
anova(lm(residuals(model_rmr_light_f2) ~ fitted.values(model_rmr_light_f2)))
Analysis of Variance Table

Response: residuals(model_rmr_light_f2)
                                  Df Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_rmr_light_f2)  1  0.047 0.04747   0.059 0.8087
Residuals                         89 71.638 0.80492               
plot(model_rmr_all_m2)
plot(model_rmr_dark_m2)
plot(model_rmr_light_m2)

plot(model_rmr_all_f2)
plot(model_rmr_dark_f2)
plot(model_rmr_light_f2)
options(contrasts=c("contr.sum", "contr.poly"))

results_model_rmr_all_m <- car::Anova(model_rmr_all_m2, test.statistic ="F", type ="II") %>% 
  as.data.frame() %>% 
  tibble::rownames_to_column(var = "model_term") %>%
  dplyr::mutate(Circ = "All", 
                Sex = "M") 
results_model_rmr_dark_m <- car::Anova(model_rmr_dark_m2, test.statistic ="F", type ="II") %>% 
  as.data.frame() %>% 
  tibble::rownames_to_column(var = "model_term") %>%
  dplyr::mutate(Circ = "Dark", 
                Sex = "M") 
results_model_rmr_light_m<-car::Anova(model_rmr_light_m2, test.statistic ="F", type ="II") %>% 
  as.data.frame() %>% 
  tibble::rownames_to_column(var = "model_term") %>%
  dplyr::mutate(Circ = "Light", 
                Sex = "M")

results_model_rmr_all_f <- car::Anova(model_rmr_all_f2, test.statistic ="F", type ="II") %>% 
  as.data.frame() %>% 
  tibble::rownames_to_column(var = "model_term") %>%
  dplyr::mutate(Circ = "All", 
                Sex = "F") 
results_model_rmr_dark_f <- car::Anova(model_rmr_dark_f2, test.statistic ="F", type ="II") %>% 
  as.data.frame() %>% 
  tibble::rownames_to_column(var = "model_term") %>%
  dplyr::mutate(Circ = "Dark", 
                Sex = "F") 
results_model_rmr_light_f <-car::Anova(model_rmr_light_f2, test.statistic ="F", type ="II") %>% 
  as.data.frame() %>% 
  tibble::rownames_to_column(var = "model_term") %>%
  dplyr::mutate(Circ = "Light", 
                Sex = "F")


rbind(results_model_rmr_all_m, results_model_rmr_dark_m, results_model_rmr_light_m, 
      results_model_rmr_all_f, results_model_rmr_dark_f, results_model_rmr_light_f) %>%
  dplyr::filter(model_term == "Category") 
model_rest_all.rmr_meff<-(lmer(All_RMR ~ Category+ Promethion_weight_norm + (1 |Batch), Circadian_RMR_M))
boundary (singular) fit: see help('isSingular')
model_rest_dark.rmr_meff<-(lmer(Dark_RMR ~ Category+ Promethion_weight_norm + (1 |Batch), Circadian_RMR_M))
model_rest_light.rmr_meff<-(lmer(Light_RMR ~ Category+ Promethion_weight_norm + (1 |Batch), Circadian_RMR_M))
boundary (singular) fit: see help('isSingular')
model_rest_all.rmr_feff<-(lmer(All_RMR ~ Category+ Promethion_weight_norm + (1 |Batch), Circadian_RMR_F))
model_rest_dark.rmr_feff<-(lmer(Dark_RMR ~ Category+ Promethion_weight_norm + (1 |Batch), Circadian_RMR_F))
model_rest_light.rmr_feff<-(lmer(Light_RMR ~ Category+ Promethion_weight_norm + (1 |Batch), Circadian_RMR_F))

eff_RMR_all_m<- effects::effect("Category", model_rest_all.rmr_meff, se = TRUE) %>% as.data.frame %>% dplyr::mutate(Circ ="All", Sex ="M")
eff_RMR_dark_m<- effects::effect("Category", model_rest_dark.rmr_meff, se = TRUE) %>% as.data.frame %>% dplyr::mutate(Circ ="dark", Sex ="M")
eff_RMR_light_m<- effects::effect("Category", model_rest_light.rmr_meff, se = TRUE) %>% as.data.frame %>% dplyr::mutate(Circ ="light", Sex ="M")

eff_RMR_all_f<- effects::effect("Category", model_rest_all.rmr_feff, se = TRUE) %>% as.data.frame %>% dplyr::mutate(Circ ="All", Sex ="F")
eff_RMR_dark_f<- effects::effect("Category", model_rest_dark.rmr_feff, se = TRUE) %>% as.data.frame %>% dplyr::mutate(Circ ="dark", Sex ="F")
eff_RMR_light_f<- effects::effect("Category", model_rest_light.rmr_feff, se = TRUE) %>% as.data.frame %>% dplyr::mutate(Circ ="light", Sex ="F")

rbind(eff_RMR_all_m, eff_RMR_dark_m, eff_RMR_light_m, eff_RMR_all_f, eff_RMR_dark_f, eff_RMR_light_f) %>% dplyr::select(Sex, Category, Circ, fit, se)
model_rest_all.rmr_m_resid<-(lmer(All_RMR_norm ~  Promethion_weight_norm + (1 |Batch), Circadian_RMR_M))
boundary (singular) fit: see help('isSingular')
model_rest_dark.rmr_m_resid<-(lmer(Dark_RMR_norm ~  Promethion_weight_norm + (1 |Batch), Circadian_RMR_M))
model_rest_light.rmr_m_resid<-(lmer(Light_RMR_norm ~  Promethion_weight_norm + (1 |Batch), Circadian_RMR_M))
boundary (singular) fit: see help('isSingular')
model_rest_all.rmr_f_resid<-(lmer(All_RMR_norm ~  Promethion_weight_norm + (1 |Batch), Circadian_RMR_F))
model_rest_dark.rmr_f_resid<-(lmer(Dark_RMR_norm ~ Promethion_weight_norm + (1 |Batch), Circadian_RMR_F))
model_rest_light.rmr_f_resid<-(lmer(Light_RMR_norm ~  Promethion_weight_norm + (1 |Batch), Circadian_RMR_F))

Circadian_RMR_M2 <- Circadian_RMR_M %>% 
  dplyr::mutate(all_rmr_resid = residuals(model_rest_all.rmr_m_resid)/sigma(model_rest_all.rmr_m_resid), 
                dark_rmr_resid = residuals(model_rest_dark.rmr_m_resid)/sigma(model_rest_dark.rmr_m_resid),
                light_rmr_resid = residuals(model_rest_light.rmr_m_resid)/sigma(model_rest_light.rmr_m_resid))
Circadian_RMR_F2 <- Circadian_RMR_F %>% 
  dplyr::mutate(all_rmr_resid = residuals(model_rest_all.rmr_f_resid)/sigma(model_rest_all.rmr_f_resid), 
                dark_rmr_resid = residuals(model_rest_dark.rmr_f_resid)/sigma(model_rest_dark.rmr_f_resid),
                light_rmr_resid = residuals(model_rest_light.rmr_f_resid)/sigma(model_rest_light.rmr_f_resid))

Circadian_rmr_resid <- rbind(Circadian_RMR_M2, Circadian_RMR_F2) %>%
  dplyr::select(MouseID, dark_rmr_resid, light_rmr_resid, all_rmr_resid) %>%
  dplyr::rename(Dark = dark_rmr_resid, Light = light_rmr_resid, All = all_rmr_resid) %>%
  tidyr::gather(Circ, mean_resting_metabolic_rate_residuals, Dark:All) %>%
  dplyr::left_join(metadata, by = c("MouseID"))

Fig2_rmr_dark_light <- Circadian_rmr_resid %>% 
  dplyr::filter(Circ != "All") %>% 
  ggplot(aes(x = Category, y = mean_resting_metabolic_rate_residuals, shape = Sex, color = Category)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Category), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_Category, label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Killed" = "Killed-\nCM", "Live" = "Live-\nCM")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  theme(axis.text.x = element_text(face = "italic")) +
    facet_grid(Sex~Circ) + 
  theme(#strip.background = element_blank(),
   strip.text.y = element_blank()) +
  labs(y="Adj. resting metabolic rate") 
Fig2_rmr_dark_light


FigS3_rmr_all <- Circadian_rmr_resid %>% 
  dplyr::filter(Circ == "All") %>%  
  ggplot(aes(x = Category, y = mean_resting_metabolic_rate_residuals, shape = Sex, color = Category)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Category), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_Category, label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Killed" = "Killed-\nCM", "Live" = "Live-\nCM")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  theme(axis.text.x = element_text(face = "italic")) +
    facet_grid(.~Sex) + 
  theme(strip.background = element_blank(),
   strip.text = element_blank()) +
  labs(y="Adj. resting metabolic rate") 
FigS3_rmr_all

Figure 2: Higher physical activity and metabolic energy expenditure in mice with live C. minuta

Fig2_legend <- cowplot::get_legend(metadata_Cmin %>% 
  dplyr::mutate(Sex = ifelse(Sex == "F", "Female", "Male"), 
                Category = ifelse(Category == "Killed", "Killed-CM", "Live-CM"), 
                Sex_Category = paste(Sex, Category, sep = " ")) %>%
  ggplot(aes(x = Category, y = qPCR_Cmin_per_gCC, shape = Sex_Category, color = Sex_Category)) + 
  geom_point(aes(shape = Sex_Category, color= Sex_Category), alpha =0.7, size =0.5, show.legend = T) +
  scale_shape_manual(values=c(16, 16,4, 4)) + 
  scale_color_manual(values=c(color_Category, color_Category)) +
  theme_classic(base_size = 10) +
  guides(shape = guide_legend(override.aes = list(size = 3, alpha = 1))) +
  theme(legend.title=element_blank()) + 
  theme(legend.position = "bottom"))

Fig2_align_1 <- cowplot::align_plots(Fig2_beam_breaks + theme(legend.position="none"),
                                 Fig2_bb_cmin + theme(legend.position="none"),
                                 Fig2_bb_fe + theme(legend.position="none"),
                                 Fig2_distance + theme(legend.position="none"),  
                                 Fig2_distance_cmin + theme(legend.position="none"), 
                                 Fig2_fe_distance + theme(legend.position="none"),
                                 align = 'hv', axis = 'tblr')
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
Fig2_align_2 <- cowplot::align_plots(Fig2_ee_weight + theme(legend.position="none"),
                                 Fig2_ee_resid + theme(legend.position="none"),
                                 Fig2_rmr_dark_light + theme(legend.position="none"),
                                 align = 'hv', axis = 'tblr')
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 6 rows containing non-finite values (stat_smooth).Warning: Removed 6 rows containing missing values (geom_point).
Fig2_1 <- cowplot::plot_grid(NA,
                               Fig2_align_1[[1]],  
                               Fig2_align_1[[2]], 
                               Fig2_align_1[[3]], 
                               NA, 
                               Fig2_align_1[[4]], 
                               Fig2_align_1[[5]], 
                               Fig2_align_1[[6]], 
                               ncol=4, nrow=2, labels = c(NA,"A", "C", "E", NA, "B", "D", "F"), label_size = 12, rel_widths = c(0.3, 1, 1.5, 1.5), rel_heights = c(1.2, 2))
Warning: Cannot convert object of class logical into a grob.Warning: Cannot convert object of class logical into a grob.
Fig2_2 <- cowplot::plot_grid(NA, 
                               Fig2_align_2[[1]], 
                               Fig2_align_2[[2]], 
                               Fig2_align_2[[3]], 
                               ncol=4, nrow=1, labels = c(NA, "G", "H", "I"),label_size = 12, rel_widths = c(0.3, 1.2, 1, 1.8))
Warning: Cannot convert object of class logical into a grob.
Figure2 <- cowplot::plot_grid(Fig2_1, 
                             Fig2_2, 
                             Fig2_legend, 
                             ncol=1, nrow=3, rel_heights = c(3.2, 2, 0.3))
Warning: Removed 1 rows containing missing values (geom_text).Warning: Removed 1 rows containing missing values (geom_text).Warning: Removed 1 rows containing missing values (geom_text).
Figure2

ggsave("./Figure2.pdf", plot = Figure2, device = cairo_pdf,  
  width = 17,
  height = 19,
  units = "cm")

Figure S3: Mouse voluntary activity and average resting metabolic rate

FigS3_align <- cowplot::align_plots(FigS3_speed + theme(legend.position="none"),
                                      FigS3_rmr_all + theme(legend.position="none"), 
                                      align = 'hv', axis = 'tblr')


FigS3_1 <- cowplot::plot_grid(FigS3_align[[1]], 
                                    FigS3_align[[2]],
                                    ncol=2, nrow=1, labels = c("A", "B"), label_size = 12, rel_widths = c(0.9, 1.5))
FigS3 <- cowplot::plot_grid(FigS3_1, 
                                    Fig2_legend,
                                    ncol=1, nrow=2, rel_heights = c(1, 0.1 ))
FigS3

ggsave("./FigS3.pdf", plot = FigS3, device = cairo_pdf,  
  width = 9,
  height = 7.5,
  units = "cm")

C. minuta increases gut microbial biomass and remodels diversity

Microbial biomass

Fig3_qPCR_bacteria <- metadata_Cmin %>% 
  dplyr::mutate(SQ_per_gCC_e10 = qPCR_16S_SQ_per_gCC/10^10) %>%
  ggplot(aes(x = Category, y = SQ_per_gCC_e10, shape = Sex, color = Category)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Category), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_Category, label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Killed" = "Killed-\nCM", "Live" = "Live-\nCM")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  labs(y = expression(paste("Microbes (GE/g) x", e^10))) +
  theme(axis.text.x = element_text(face = "italic")) 
Fig3_qPCR_bacteria

set.seed(759)
metadata_Cmin <- metadata_Cmin %>% 
  dplyr::mutate(qPCR_16S_SQ_per_gCC = as.numeric(qPCR_16S_SQ_per_gCC), 
                qPCR_16S_SQ_per_gCC_norm = predict(bestNormalize(qPCR_16S_SQ_per_gCC)))

options(contrasts=c("contr.sum", "contr.poly"))
model_biomass<- lmerTest::lmer(qPCR_16S_SQ_per_gCC_norm ~ Category*Sex + T6_weight + Plate + (1|qPCR_Round/Batch/Sex), data = metadata_Cmin)
Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 2 negative eigenvaluesWarning: Model failed to converge with 2 negative eigenvalues: -1.4e-08 -1.1e-03
lmerTest::step(model_biomass, keep = "Category")
Warning: Model is nearly unidentifiable: large eigenvalue ratio
 - Rescale variables?Warning: Model is nearly unidentifiable: large eigenvalue ratio
 - Rescale variables?Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvaluesWarning: Model failed to converge with 1 negative eigenvalue: -8.1e-04Warning: Model is nearly unidentifiable: large eigenvalue ratio
 - Rescale variables?
Backward reduced random-effect table:

                             Eliminated npar  logLik    AIC    LRT Df Pr(>Chisq)  
<none>                                    11 -251.44 524.89                       
(1 | Sex:(Batch:qPCR_Round))          1   10 -251.44 522.89 0.0000  1    1.00000  
(1 | qPCR_Round)                      2    9 -251.44 520.89 0.0000  1    1.00000  
(1 | Batch:qPCR_Round)                0    8 -253.30 522.60 3.7152  1    0.05392 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Backward reduced fixed-effect table:
Degrees of freedom method: Satterthwaite 

             Eliminated Sum Sq Mean Sq NumDF   DenDF F value  Pr(>F)  
Category:Sex          1 0.0785  0.0785     1 166.180  0.0945 0.75893  
T6_weight             2 0.3091  0.3091     1 171.758  0.3742 0.54151  
Sex                   3 1.1350  1.1350     1   9.694  1.3783 0.26842  
Category              0 5.3811  5.3811     1 168.188  6.5377 0.01145 *
Plate                 0 8.2627  4.1314     2  19.773  5.0193 0.01726 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
qPCR_16S_SQ_per_gCC_norm ~ Category + Plate + (1 | Batch:qPCR_Round)
model_biomass.2<- lmer(qPCR_16S_SQ_per_gCC_norm ~ Category + Plate + (1 | Batch:qPCR_Round), data = metadata_Cmin)

shapiro.test(residuals(model_biomass.2))

    Shapiro-Wilk normality test

data:  residuals(model_biomass.2)
W = 0.9801, p-value = 0.01094
anova(lm(residuals(model_biomass.2) ~ fitted(model_biomass.2))) # test for heteroscedasticity 
Analysis of Variance Table

Response: residuals(model_biomass.2)
                         Df  Sum Sq Mean Sq F value Pr(>F)
fitted(model_biomass.2)   1   0.764 0.76419  0.9759 0.3245
Residuals               179 140.169 0.78307               
plot(model_biomass.2)

car::Anova(model_biomass.2, type = "II", test.statistic ="F")
Analysis of Deviance Table (Type II Wald F tests with Kenward-Roger df)

Response: qPCR_16S_SQ_per_gCC_norm
              F Df  Df.res  Pr(>F)  
Category 6.5313  1 167.738 0.01149 *
Plate    4.8712  2  24.506 0.01655 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
model_biomass.eff<- lmer(qPCR_16S_SQ_per_gCC~ Category + Plate + (1 | Batch:qPCR_Round), data = metadata_Cmin)
Warning: Model may not have converged with 1 eigenvalue close to zero: 1.8e-17
effects::effect("Category", model_biomass.eff, se =TRUE) %>% as.data.frame

Corrleation microbial biomass ~ C. minuta

Fig3_Cmin_biomass<- metadata_Cmin %>%
  ggplot(aes(x= qPCR_Cmin_per_gCC_norm ,y=qPCR_16S_SQ_per_gCC_norm)) +
  geom_smooth(method = "lm", se = F, alpha = 0.5, size = 0.5, color ="black")+ 
  geom_point(aes(shape = Sex, color =Category), alpha =0.7, size =0.75, show.legend = T) +
  scale_shape_manual(values=shape_Sex, label = c("Female", "Male"),name = "Sex") + 
  scale_color_manual(values=color_Category, label = c(expression(italic("Killed-CM")), expression(italic("Live-CM"))), name = "Treatment") +
  theme_classic(base_size = 10) +
  stat_cor(method = "spearman",  cor.coef.name = c("rho"), size = 3) +
  labs(y = "Norm. Microbes", x = "Norm. C. minuta")
Fig3_Cmin_biomass

Modification of profiled metagenomic data

# Unrarefied OTUs
reads_unrare <- Bracken_otu_table_reads %>%
  dplyr::select(OTU_ID, contains("CC"), # select only cecal content samples
                -taxonomy, -contains(Metagenomics_exclude_id)) %>% 
  dplyr::rename(rowname = "OTU_ID") %>% 
  tidyr::gather(var, value, -rowname) %>% 
  tidyr::spread(rowname, value) %>%
  tibble::column_to_rownames(var = "var") 

names(reads_unrare) <- properColnames(reads_unrare)

# Rarefied OTUs
set.seed(2)
reads_rare = reads_unrare %>% 
 GUniFrac::Rarefy(460000)
reads_rare = reads_rare$otu.tab.rff %>% 
  as.data.frame()

Reads normalization by micriobial biomass (approximation to absolute abundance)

reads_rare_norm <- reads_rare %>%
  tibble::rownames_to_column(var = "rowname") %>% 
  tidyr::gather(var, value, -rowname) %>% 
  tidyr::spread(rowname, value) %>% 
  dplyr::rename(OTU_ID = var) 

reads_rare_norm[,2:183] <- as.data.table(lapply(reads_rare_norm[,2:183], as.numeric))

reads_rare_norm <- reads_rare_norm %>%
  dplyr::rename(rowname = OTU_ID) %>%
  dplyr::mutate_if(is.numeric,function(x) (x/sum(x))) %>%
  tidyr::gather(var, value, -rowname) %>% 
  tidyr::spread(rowname, value) %>% 
  dplyr::rename(sampleid = var) %>%
  dplyr::left_join(Metagenomics_metadata_CC, by ="sampleid") %>%
  dplyr::left_join(metadata, by ="MouseID") %>%
  dplyr::left_join(qPCR_data, by ="MouseID") %>%
  dplyr::mutate(qPCR_16S_SQ_per_gCC = as.numeric(qPCR_16S_SQ_per_gCC))  %>%
  dplyr::group_by(sampleid) %>%
  dplyr::mutate_each(funs(.*qPCR_16S_SQ_per_gCC), starts_with("s__"))

write.table(reads_rare_norm, file = "./data/Interim_output/reads_rare_norm.txt",row.names=FALSE,sep="\t", quote = FALSE)
reads_rare_norm<- fread("./data/Interim_output/reads_rare_norm.txt") 

Taxa barplots

Taxonomy <- Bracken_otu_table_reads %>%
  dplyr::select(OTU_ID, taxonomy) %>%
  dplyr::mutate(var = OTU_ID) 

Taxonomy$var <-properNames(Taxonomy$var)
Taxonomy$OTU_ID <- gsub(" ", "_", Taxonomy$OTU_ID)
reads_rare_norm_metadata <- reads_rare_norm %>%
  tibble::column_to_rownames(var = "sampleid") %>%
  dplyr::select(-contains("s__"))

reads_rare_norm_reads <- reads_rare_norm %>%
  dplyr::select(sampleid, contains("s__")) %>%
  tidyr::gather(var, value, -sampleid) %>% 
  tidyr::spread(sampleid, value) %>%
  dplyr::mutate_if(is.numeric, round) %>%
  tibble::column_to_rownames(var = "var")

# Separate taxonomy
tax_levels = c("Domain", "Phylum", "Class", "Order", "Family", "Genus", "Species")
# Also note that the unclassified reads do not count for the total seq count!
MF_bracken <- reads_rare_norm_reads %>%
  tibble::rownames_to_column(var = "var") %>%
  dplyr::mutate_at(c(2:183), as.numeric) %>%
  dplyr::left_join(Taxonomy, by ="var") %>% 
  dplyr::rename(name = var) %>% 
  dplyr::filter(name != "Unclassified") %>% 
  tidyr::separate(taxonomy, into = tax_levels, sep = ";") 

# Total counts for relative abundance
Total_counts = MF_bracken %>% 
  dplyr::select_if(is.numeric) %>% 
  dplyr::summarise_all(sum)

# summarize genus
Taxa_df = MF_bracken %>%
  dplyr::group_by(Genus) %>% 
  dplyr::summarise_if(is.numeric, sum) %>% 
  dplyr::ungroup() %>% 
  dplyr::rename("Taxon" = "Genus")

# Bind tables and transform to relative abundance
Taxa_df_raw = Taxa_df %>% 
  dplyr::rowwise() %>% 
  dplyr::mutate(mean_abund = mean(c_across(where(is.numeric)))) 

# Filter taxa with mean abund < 0.5
Taxa_vec = Taxa_df_raw %>% 
  dplyr::filter(mean_abund >= 100000000) %>% 
  dplyr::pull(Taxon)

# Create df of abundant taxa
Abundant_df = Taxa_df_raw %>% 
  dplyr::filter(Taxon %in% Taxa_vec)

# Collapse rare taxa into 'other'
Rare_df = Taxa_df_raw %>% 
  ungroup() %>% 
  dplyr::filter(!(Taxon %in% Taxa_vec)) %>% 
  dplyr::summarise_if(is.numeric, sum) %>% 
  dplyr::mutate(Taxon = "Other") %>% 
  dplyr::select(Taxon, everything())

# Join and melt
Taxa_df.2 = bind_rows(Abundant_df, Rare_df) %>% 
  dplyr::select(-mean_abund) %>% 
  tidyr::pivot_longer(cols = -Taxon, names_to = "Sample", values_to = "Abundance")
metadata_taxa_barplot <- metadata %>%
  dplyr::select(MouseID, Category, Batch) %>%
  dplyr::group_by(Category, Batch) %>%
  dplyr::mutate(Mouse_nr_Category_Batch = row_number()) %>%
  dplyr::ungroup() %>%
  dplyr::select(MouseID, Mouse_nr_Category_Batch)

Taxa_barplot <- reads_rare_norm_metadata %>%
  tibble::rownames_to_column(var = "Sample") %>%
  dplyr::left_join(Taxa_df.2, by = "Sample") %>%
  dplyr::left_join(metadata_taxa_barplot, by = "MouseID") %>%
  dplyr::mutate(Abundance = as.numeric(Abundance))
taxabarplot_levels <- reads_rare_norm_metadata %>% 
  dplyr::arrange(Category, -qPCR_16S_SQ_per_gCC) %>%
  dplyr::pull(MouseID)

FigS4_Taxa_barplot<- Taxa_barplot %>%
  dplyr::mutate(Abundance = as.numeric(Abundance)) %>%
  tidyr::separate(Taxon, into =c(NA, "Taxon"), sep= "__") %>%
  dplyr::mutate(Taxon = replace_na(Taxon, "Other")) %>%
  dplyr::mutate(Taxon = factor(Taxon, levels = c("Alistipes", "Bacteroides", "COE1", "Eisenbergiella","Enterocloster", "Flavonifractor", "Parabacteroides", "Phocaeicola", "Ruthenibacterium", "Tolumonas", "Other"))) %>%
  dplyr::mutate(Abundance_10x10 = Abundance/10^10) %>%
  dplyr::mutate(Category2 = ifelse(Category == "Killed", "Killed-CM", "Live-CM")) %>%
  ggplot(aes(x=factor(MouseID, levels = taxabarplot_levels), y=Abundance_10x10, fill=Taxon)) +
  geom_bar(stat="identity") +
  theme_classic(base_size = 10) + 
  scale_fill_manual(values = c("#000000", "#b6dbff","#920000", "#009292", "#ffb6db", "#ffff6d", "#db6d00", "#006ddb", "#24ff24", "#ff6db6", "#004949"), 
                    name = "Genus") +
  theme(axis.text.x=element_blank(),
        axis.ticks.x=element_blank()) +
  coord_cartesian(clip = "off") +
  theme(legend.position="right", legend.key.size=unit(0.4, "cm"),
        legend.text=element_text(face = "italic")) +
  ggh4x::facet_grid2(Sex~Category2, scales = "free_x", independent = "x") +
  guides(fill=guide_legend(title.position = "top")) +
  labs(y= expression(paste("Microbes (GE/g) x", e^10)), x ="Mice") +
    theme(strip.background.y = element_blank(),
        strip.text.y = element_blank()) 
Warning: Expected 2 pieces. Missing pieces filled with `NA` in 182 rows [11, 22, 33, 44, 55, 66, 77, 88, 99, 110, 121, 132, 143, 154, 165, 176, 187, 198, 209, 220, ...].
FigS4_Taxa_barplot

alpha and beta diversity in qiime with absolute sequences

gc()
# prepare file
qiime2_reads_rare_norm<- reads_rare_norm %>%
  dplyr::select(sampleid, contains("s__")) %>%
  dplyr::rename(rowname = sampleid) %>% 
  tidyr::gather(var, value, -rowname) %>% 
  tidyr::spread(rowname, value) %>%
  dplyr::group_by(var) %>%
  dplyr::mutate(sum_abubnd = sum(c_across(where(is.numeric)))) %>%
  dplyr::filter(sum_abubnd > 0) %>%
  dplyr::select(-sum_abubnd) %>%
  dplyr::ungroup() %>%
  dplyr::left_join(Taxonomy, by ="var") %>%
  dplyr::select(contains("OTU"), contains("CC"), taxonomy) %>%
  dplyr::rename("#OTU ID" = OTU_ID)
gc()
#save output
write.table(qiime2_reads_rare_norm, file = "./data/Interim_output/qiime2_reads_rare_norm.txt", sep = "\t" , row.names = FALSE, quote = FALSE)
source activate /ebio/abt3_projects/Christensenella_CM20/envs/qiime2 #path to qiime2-2022.2 environment

##qiime import data
biom convert -i ./data/Interim_output/qiime2_reads_rare_norm.txt \
          -o ./data/Interim_output/qiime2_reads_rare_norm.biom \
          --to-hdf5 --process-obs-metadata taxonomy \
          --table-type "OTU table"

qiime tools import \
          --input-path ./data/Interim_output/qiime2_reads_rare_norm.biom \
          --output-path ./data/Interim_output/qiime2_reads_rare_norm.qza \
          --type 'FeatureTable[Frequency]' \
          --input-format BIOMV210Format

##run diversity
qiime diversity alpha \
          --p-metric observed_features \
          --i-table ./data/Interim_output/qiime2_reads_rare_norm.qza \
          --o-alpha-diversity ./data/Interim_output/alpha_observed_features.qza

qiime diversity alpha \
          --p-metric shannon \
          --i-table ./data/Interim_output/qiime2_reads_rare_norm.qza \
          --o-alpha-diversity ./data/Interim_output/alpha_shannon.qza

qiime diversity alpha \
          --p-metric pielou_e \
          --i-table ./data/Interim_output/qiime2_reads_rare_norm.qza \
          --o-alpha-diversity ./data/Interim_output/alpha_pielou.qza
          
qiime diversity alpha-phylogenetic \
          --p-metric faith_pd \
          --i-table ./data/Interim_output/qiime2_reads_rare_norm.qza \
          --i-phylogeny ./data/Metagenomics/rooted_tree.qza \
          --o-alpha-diversity ./data/Interim_output/alpha_faithPD.qza


qiime diversity beta-phylogenetic \
          --p-metric weighted_unifrac \
          --i-table ./data/Interim_output/qiime2_reads_rare_norm.qza \
          --i-phylogeny ./data/Metagenomics/rooted_tree.qza \
          --o-distance-matrix ./data/Interim_output/beta_wUF.qza

qiime diversity beta-phylogenetic \
          --p-metric unweighted_unifrac \
          --i-table ./data/Interim_output/qiime2_reads_rare_norm.qza \
          --i-phylogeny ./data/Metagenomics/rooted_tree.qza \
          --o-distance-matrix ./data/Interim_output/beta_uwUF.qza

##export data
qiime tools export \
  --input-path ./data/Interim_output/alpha_observed_features.qza \
  --output-path ./data/Interim_output/alpha_observed_features

qiime tools export \
  --input-path ./data/Interim_output/alpha_shannon.qza \
  --output-path ./data/Interim_output/alpha_shannon

qiime tools export \
  --input-path ./data/Interim_output/alpha_pielou.qza \
  --output-path ./data/Interim_output/alpha_pielou

qiime tools export \
  --input-path ./data/Interim_output/alpha_faithPD.qza \
  --output-path ./data/Interim_output/alpha_faithPD

qiime tools export \
  --input-path ./data/Interim_output/beta_wUF.qza \
  --output-path ./data/Interim_output/beta_wUF

qiime tools export \
  --input-path ./data/Interim_output/beta_uwUF.qza \
  --output-path ./data/Interim_output/beta_uwUF

alpha diversity

Alpha_FPD <- fread("./data/Interim_output/alpha_faithPD/alpha-diversity.tsv") %>%
  dplyr::rename(sampleid = "#SampleID")
Alpha_observedF <- fread("./data/Interim_output/alpha_observed_features/alpha-diversity.tsv") %>%
  dplyr::rename(sampleid = "V1")
Alpha_S <- fread("./data/Interim_output/alpha_shannon/alpha-diversity.tsv") %>%
  dplyr::rename(sampleid = "V1")
Alpha_P <- fread("./data/Interim_output/alpha_pielou/alpha-diversity.tsv") %>%
  dplyr::rename(sampleid = "V1")
  
Alpha_div <- Alpha_FPD %>%
  dplyr::left_join(Alpha_observedF, by = "sampleid") %>%
  dplyr::left_join(Alpha_S, by = "sampleid") %>%
  dplyr::left_join(Alpha_P, by = "sampleid") %>%
  dplyr::left_join(Metagenomics_metadata_CC, by = "sampleid") %>%
  dplyr::filter(!grepl(paste(Metagenomics_exclude_id, collapse="|"), sampleid)) %>%
  dplyr::left_join(metadata, by = "MouseID")
Fig3_SE <- Alpha_div %>%
  ggplot(aes(x = Category, y = shannon_entropy, shape = Sex, color = Category)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Category), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_Category, label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Killed" = "Killed-\nCM", "Live" = "Live-\nCM")) +
  theme_classic(base_size = 10) +
  theme(legend.position="right") +
  labs(y = "Shannon Entropy") +
  theme(axis.text.x = element_text(face = "italic")) +
  theme(axis.title.x=element_blank())+
  facet_grid(.~Sex)
Fig3_SE


Fig3_OF <- Alpha_div %>%
  ggplot(aes(x = Category, y = observed_features, shape = Sex, color = Category)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Category), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_Category, label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Killed" = "Killed-\nCM", "Live" = "Live-\nCM")) +
  theme_classic(base_size = 10) +
  theme(legend.position="right") +
  labs(y = "# microbial species") +
  theme(axis.text.x = element_text(face = "italic")) +
  theme(axis.title.x=element_blank())+
  facet_grid(.~Sex)
Fig3_OF


FigS4_FDP  <- Alpha_div %>%
  ggplot(aes(x = Category, y = faith_pd, shape = Sex, color = Category)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Category), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_Category, label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Killed" = "Killed-\nCM", "Live" = "Live-\nCM")) +
  theme_classic(base_size = 10) +
  theme(legend.position="right") +
  labs(y = "Faith's PD") +
  theme(axis.text.x = element_text(face = "italic")) +
  theme(axis.title.x=element_blank()) +
  facet_grid(.~Sex)
FigS4_FDP 


FigS4_PE  <- Alpha_div %>%
  ggplot(aes(x = Category, y = pielou_evenness, shape = Sex, color = Category)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Category), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_Category, label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Killed" = "Killed-\nCM", "Live" = "Live-\nCM")) +
  theme_classic(base_size = 10) +
  theme(legend.position="right") +
  labs(y = "Pilou evenness") +
  theme(axis.text.x = element_text(face = "italic")) +
  theme(axis.title.x=element_blank())+
  facet_grid(.~Sex)
FigS4_PE 

wilcox.test due to problems with normality

options(backup_options)
Alpha_div_M <- Alpha_div %>%
  dplyr::filter(Sex =="M")
Alpha_div_F <- Alpha_div %>%
  dplyr::filter(Sex =="F")
print("se M")
[1] "se M"
wilcox.test(shannon_entropy~Category, data = Alpha_div_M, exact = FALSE, correct = FALSE, conf.int = FALSE)

    Wilcoxon rank sum test

data:  shannon_entropy by Category
W = 1341, p-value = 0.003972
alternative hypothesis: true location shift is not equal to 0
print("se F")
[1] "se F"
wilcox.test(shannon_entropy~Category, data = Alpha_div_F, exact = FALSE, correct = FALSE, conf.int = FALSE)

    Wilcoxon rank sum test

data:  shannon_entropy by Category
W = 1191, p-value = 0.398
alternative hypothesis: true location shift is not equal to 0
print("pe M")
[1] "pe M"
wilcox.test(pielou_evenness~Category, data = Alpha_div_M, exact = FALSE, correct = FALSE, conf.int = FALSE)

    Wilcoxon rank sum test

data:  pielou_evenness by Category
W = 1143, p-value = 0.2093
alternative hypothesis: true location shift is not equal to 0
print("pe F")
[1] "pe F"
wilcox.test(pielou_evenness~Category, data = Alpha_div_F, exact = FALSE, correct = FALSE, conf.int = FALSE)

    Wilcoxon rank sum test

data:  pielou_evenness by Category
W = 1231, p-value = 0.2491
alternative hypothesis: true location shift is not equal to 0
print("fpd M")
[1] "fpd M"
wilcox.test(faith_pd~Category, data = Alpha_div_M, exact = FALSE, correct = FALSE, conf.int = FALSE)

    Wilcoxon rank sum test

data:  faith_pd by Category
W = 1260, p-value = 0.02672
alternative hypothesis: true location shift is not equal to 0
print("fpd F")
[1] "fpd F"
wilcox.test(faith_pd~Category, data = Alpha_div_F, exact = FALSE, correct = FALSE, conf.int = FALSE)

    Wilcoxon rank sum test

data:  faith_pd by Category
W = 1147, p-value = 0.612
alternative hypothesis: true location shift is not equal to 0
print("of M")
[1] "of M"
wilcox.test(observed_features~Category, data = Alpha_div_M, exact = FALSE, correct = FALSE, conf.int = FALSE)

    Wilcoxon rank sum test

data:  observed_features by Category
W = 1293, p-value = 0.0129
alternative hypothesis: true location shift is not equal to 0
print("of F")
[1] "of F"
wilcox.test(observed_features~Category, data = Alpha_div_F, exact = FALSE, correct = FALSE, conf.int = FALSE)

    Wilcoxon rank sum test

data:  observed_features by Category
W = 1122.5, p-value = 0.7498
alternative hypothesis: true location shift is not equal to 0
standard_error <- function(x) sd(x) / sqrt(length(x))

mean_se_treat_M <- Alpha_div_M %>%
  dplyr::group_by(Category) %>%
  dplyr::summarise(mean = mean(shannon_entropy), se = standard_error(shannon_entropy))%>%
  dplyr::mutate(alpha = "se")

mean_pe_treat_M <- Alpha_div_M %>%
  dplyr::group_by(Category) %>%
  dplyr::summarise(mean = mean(pielou_evenness), se = standard_error(pielou_evenness))%>%
  dplyr::mutate(alpha = "pe")

mean_fdp_treat_M <- Alpha_div_M%>%
  dplyr::group_by(Category) %>%
  dplyr::summarise(mean = mean(faith_pd), se = standard_error(faith_pd))%>%
  dplyr::mutate(alpha = "fdp")

mean_of_treat_M <- Alpha_div_M %>%
  dplyr::group_by(Category) %>%
  dplyr::summarise(mean = mean(observed_features), se = standard_error(observed_features)) %>%
  dplyr::mutate(alpha = "of")

rbind(mean_se_treat_M, mean_pe_treat_M, mean_fdp_treat_M, mean_of_treat_M)
mean_se_treat_F <- Alpha_div_F %>%
  dplyr::group_by(Category) %>%
  dplyr::summarise(mean = mean(shannon_entropy), se = standard_error(shannon_entropy))%>%
  dplyr::mutate(alpha = "se")

mean_pe_treat_F <- Alpha_div_F %>%
  dplyr::group_by(Category) %>%
  dplyr::summarise(mean = mean(pielou_evenness), se = standard_error(pielou_evenness))%>%
  dplyr::mutate(alpha = "pe")

mean_fdp_treat_F<- Alpha_div_F%>%
  dplyr::group_by(Category) %>%
  dplyr::summarise(mean = mean(faith_pd), se = standard_error(faith_pd))%>%
  dplyr::mutate(alpha = "fdp")

mean_of_treat_F <- Alpha_div_F %>%
  dplyr::group_by(Category) %>%
  dplyr::summarise(mean = mean(observed_features), se = standard_error(observed_features)) %>%
  dplyr::mutate(alpha = "of")

rbind(mean_se_treat_F, mean_pe_treat_F, mean_fdp_treat_F, mean_of_treat_F)

beta diversity

Beta_wUF <- fread("./data/Interim_output/beta_wUF/distance-matrix.tsv")
Beta_uwUF <- fread("./data/Interim_output/beta_uwUF/distance-matrix.tsv")

Beta_wUF.2 <- Beta_wUF %>%
  dplyr::filter(!grepl(paste(Metagenomics_exclude_id, collapse="|"), V1)) %>%
  dplyr::select(-contains(Metagenomics_exclude_id)) %>%
  dplyr::arrange(V1) %>%
  dplyr::select(order(colnames(.))) %>%
  tibble::column_to_rownames(var = "V1")

Beta_uwUF.2 <- Beta_uwUF %>%
  dplyr::filter(!grepl(paste(Metagenomics_exclude_id, collapse="|"), V1)) %>%
  dplyr::select(-contains(Metagenomics_exclude_id)) %>%
  dplyr::arrange(V1) %>%
  dplyr::select(order(colnames(.))) %>%
  tibble::column_to_rownames(var = "V1")

reads_rare_norm_metadata <- reads_rare_norm_metadata[ order(row.names(reads_rare_norm_metadata)), ] 

reads_rare_norm_metadata.melt <- reads_rare_norm_metadata %>% 
  tibble::rownames_to_column(var = "sampleid")  %>%
  dplyr::select(sampleid, Category, Sex) %>%
    mutate_if(is.factor,as.character)

wUF_melt <- melt(as.matrix(Beta_wUF.2)) %>%
    filter(as.character(Var1) != as.character(Var2)) %>%
    mutate_if(is.factor,as.character)

uwUF_melt <- melt(as.matrix(Beta_uwUF.2)) %>%
    filter(as.character(Var1) != as.character(Var2)) %>%
    mutate_if(is.factor,as.character)

colnames(reads_rare_norm_metadata.melt) = c("Var1", "Category1", "Sex1")
wUF_melt = left_join(wUF_melt, reads_rare_norm_metadata.melt, by = "Var1")
uwUF_melt = left_join(uwUF_melt, reads_rare_norm_metadata.melt, by = "Var1")

colnames(reads_rare_norm_metadata.melt) = c("Var2", "Category2", "Sex2")
wUF_melt = left_join(wUF_melt, reads_rare_norm_metadata.melt, by = "Var2")
uwUF_melt = left_join(uwUF_melt, reads_rare_norm_metadata.melt, by = "Var2")
set.seed(765)

wUF_melt.2 <- wUF_melt %>%
  dplyr::filter(Category1 == Category2, Sex1 == Sex2) %>%
  dplyr::mutate(Category = Category1, Sex = Sex1)
# Issue cant use linaer models --> no normality in residuals 
# I will use wilcoxen rank sum test
wUF_melt_M<- wUF_melt.2 %>%
  dplyr::filter(Sex =="M")
wUF_melt_F<- wUF_melt.2 %>%
  dplyr::filter(Sex =="F") 

print("wUF M")
[1] "wUF M"
wilcox.test(value ~ Category, data = wUF_melt_M, exact = FALSE, correct = FALSE)

    Wilcoxon rank sum test

data:  value by Category
W = 2395224, p-value < 2.2e-16
alternative hypothesis: true location shift is not equal to 0
print("wUF F")
[1] "wUF F"
wilcox.test(value ~ Category, data = wUF_melt_F, exact = FALSE, correct = FALSE)

    Wilcoxon rank sum test

data:  value by Category
W = 2216996, p-value = 0.6028
alternative hypothesis: true location shift is not equal to 0
uwUF_melt.2 <- uwUF_melt %>%
  dplyr::filter(Category1 == Category2, Sex1 == Sex2) %>%
  dplyr::mutate(Category = Category1, Sex = Sex1)
# Issue cant use linaer models --> no normality in residuals 
# I will use wilcoxen rank sum test
uwUF_melt_M<- uwUF_melt.2 %>%
  dplyr::filter(Sex =="M") 
uwUF_melt_F<- uwUF_melt.2 %>%
  dplyr::filter(Sex =="F") 

print("uwUF M")
[1] "uwUF M"
wilcox.test(value ~ Category, data = uwUF_melt_M, exact = FALSE, correct = FALSE)

    Wilcoxon rank sum test

data:  value by Category
W = 2534932, p-value < 2.2e-16
alternative hypothesis: true location shift is not equal to 0
print("uwUF F")
[1] "uwUF F"
 wilcox.test(value ~ Category, data = uwUF_melt_F, exact = FALSE, correct = FALSE) 

    Wilcoxon rank sum test

data:  value by Category
W = 2395228, p-value = 7.325e-05
alternative hypothesis: true location shift is not equal to 0
Fig3_wUF <- wUF_melt.2 %>%
  ggplot(aes(x = Category, y = value, fill=factor(Category))) +
  theme_classic(base_size = 10) +
  geom_boxplot(alpha =0.7, outlier.size = 0.3, outlier.alpha = 0.5) +
  #facet_grid(~ Sex, scales = "free") +
  scale_fill_manual(values=color_Category )+
  scale_x_discrete(labels=c("Killed" = "Killed-\nCM", "Live" = "Live-\nCM")) +
  labs(y = "weighted\nUniFrac distances")  +
  theme(axis.text.x = element_text(face = "italic"), axis.title.x=element_blank())+
  facet_grid(.~Sex)
Fig3_wUF


Fig3_uwUF <-uwUF_melt.2 %>%
  ggplot(aes(x = Category, y = value, fill=factor(Category))) +
  theme_classic(base_size = 10) +
  geom_boxplot(alpha =0.7, outlier.size = 0.3, outlier.alpha = 0.5) +
  #facet_grid(~ Sex, scales = "free") +
  scale_fill_manual(values=color_Category )+
  scale_x_discrete(labels=c("Killed" = "Killed-\nCM", "Live" = "Live-\nCM")) +
  labs(y = "unweighted\nUniFrac distances")  +
  theme(axis.text.x = element_text(face = "italic"), axis.title.x=element_blank())+
  facet_grid(.~Sex)
Fig3_uwUF

Differential Abundance Analysis

gc()
            used  (Mb) gc trigger   (Mb)  max used   (Mb)
Ncells  18538619 990.1   41356865 2208.7  41356865 2208.7
Vcells 119645453 912.9  222647753 1698.7 222647753 1698.7
# median abundance C. minuta = 0.000101087 -> 0.01% 
thresh_median <- 0.00001 #threshold median abundance (= median abundance C. minuta / 10)

reads_rare.2 <- reads_rare %>%
  tibble::rownames_to_column(var = "rowname") %>% 
  tidyr::gather(var, value, -rowname) %>% 
  tidyr::spread(rowname, value) 

reads_rare.2[,2:183] <- as.data.table(lapply(reads_rare.2[,2:183], as.numeric))


reads_rare_F<-reads_rare.2 %>%
  dplyr::select(var, contains("fB")) %>%
  dplyr::rename(rowname = var) %>%
  dplyr::mutate_if(is.numeric,function(x) (x/sum(x))) %>%
  dplyr::rowwise() %>%
  dplyr::mutate(median_abund = median(c_across(where(is.numeric)))) %>%
  dplyr::filter(median_abund >= thresh_median) %>%
  dplyr::select(-median_abund) %>%
  tidyr::gather(var, value, -rowname) %>% 
  tidyr::spread(rowname, value) %>% 
  dplyr::rename(sampleid = var) %>%
  dplyr::left_join(Metagenomics_metadata_CC, by ="sampleid") %>%
  dplyr::left_join(metadata, by ="MouseID") %>%
  dplyr::left_join(qPCR_data, by ="MouseID") %>%
  dplyr::mutate(qPCR_16S_SQ_per_gCC = as.numeric(qPCR_16S_SQ_per_gCC))  %>%
  dplyr::group_by(sampleid) %>%
  dplyr::mutate_each(funs(.*qPCR_16S_SQ_per_gCC), starts_with("s__")) %>%
  dplyr::ungroup() 

Maaslin_metadata_F <- reads_rare_F %>%
  dplyr::select(-contains("s__")) %>% 
  tibble::column_to_rownames(var = "sampleid")

Maaslin_reads_F <- reads_rare_F %>%
  dplyr::select(sampleid, contains("s__")) %>%
  tidyr::gather(var, value, -sampleid) %>% 
  tidyr::spread(sampleid, value) %>%
  dplyr::mutate_if(is.numeric, round) %>% 
  tibble::column_to_rownames(var = "var")

reads_rare_M<-reads_rare.2 %>%
  dplyr::select(var, contains("mB")) %>%
  dplyr::rename(rowname = var) %>%
  dplyr::mutate_if(is.numeric,function(x) (x/sum(x))) %>%
  dplyr::rowwise() %>%
  dplyr::mutate(median_abund = median(c_across(where(is.numeric)))) %>%
  dplyr::filter(median_abund >= thresh_median) %>%
  dplyr::select(-median_abund) %>%
  tidyr::gather(var, value, -rowname) %>% 
  tidyr::spread(rowname, value) %>% 
  dplyr::rename(sampleid = var) %>%
  dplyr::left_join(Metagenomics_metadata_CC, by ="sampleid") %>%
  dplyr::left_join(metadata, by ="MouseID") %>%
  dplyr::left_join(qPCR_data, by ="MouseID") %>%
  dplyr::mutate(qPCR_16S_SQ_per_gCC = as.numeric(qPCR_16S_SQ_per_gCC))  %>%
  dplyr::group_by(sampleid) %>%
  dplyr::mutate_each(funs(.*qPCR_16S_SQ_per_gCC), starts_with("s__")) %>%
  dplyr::ungroup()

Maaslin_metadata_M  <- reads_rare_M %>%
  dplyr::select(-contains("s__")) %>% 
  tibble::column_to_rownames(var = "sampleid")

Maaslin_reads_M <- reads_rare_M %>%
  dplyr::select(sampleid, contains("s__")) %>%
  tidyr::gather(var, value, -sampleid) %>% 
  tidyr::spread(sampleid, value) %>%
  dplyr::mutate_if(is.numeric, round) %>% 
  tibble::column_to_rownames(var = "var")
gc()
options(backup_options)

CM20_Maaslin_species_F_treat = Maaslin2(
    input_data = Maaslin_reads_F, 
    input_metadata = Maaslin_metadata_F, 
    output = "./data/Interim_output/Maaslin_species_F_treat", 
        fixed_effects = c("Category", "Run"), 
    random_effects = c("Batch"),
    reference= c("Run,R1-Hiseq"),
    min_prevalence = 0.5, 
    max_significance = 0.1, 
    plot_scatter = FALSE, 
    plot_heatmap = FALSE)

CM20_Maaslin_species_M_treat = Maaslin2(
    input_data = Maaslin_reads_M, 
    input_metadata = Maaslin_metadata_M, 
    output = "./data/Interim_output/Maaslin_species_M_treat", 
        fixed_effects = c("Category", "Run"), 
    random_effects = c("Batch"),
    reference= c("Run,R1-Hiseq"),
    min_prevalence = 0.5, 
    max_significance = 0.1, 
    plot_scatter = FALSE, 
    plot_heatmap = FALSE)
Results_MaasLin_F <- fread("./data/Interim_output/Maaslin_species_F_treat/all_results.tsv") %>%
  dplyr::filter(metadata == "Category") %>%
  dplyr::mutate(qval = p.adjust(pval, method = "BH")) %>%
  dplyr::arrange(qval) %>% 
  dplyr::mutate(analysis = "F")
Results_MaasLin_M <- fread("./data/Interim_output/Maaslin_species_M_treat/all_results.tsv") %>%
  dplyr::filter(metadata == "Category") %>%
  dplyr::mutate(qval = p.adjust(pval, method = "BH")) %>%
  dplyr::arrange(qval) %>% 
  dplyr::mutate(analysis = "M")

sig_species_treat_F <- Results_MaasLin_F %>%
  dplyr::filter(qval <= 0.1 & abs(coef) >= 1) %>%
  pull(feature)
sig_species_treat_M <- Results_MaasLin_M %>%
  dplyr::filter(qval <= 0.1 & abs(coef) >= 1) %>%
  pull(feature)

sig_species_treat_combined <- unique(c(sig_species_treat_F, sig_species_treat_M)) 

Results_MaasLin_Category_species_combined <- rbind(Results_MaasLin_F, Results_MaasLin_M) %>%
  dplyr::filter(grepl(paste(sig_species_treat_combined, collapse="|"), feature)) %>%
  dplyr::rename(var = feature) %>%
  dplyr::mutate(var = properNames(var)) %>%
  dplyr::left_join(Taxonomy, by ="var") %>%
  tidyr::separate(taxonomy, into = tax_levels, sep =";") %>%
  dplyr::select(-var, -OTU_ID) %>%
  dplyr::mutate(Species = sub("s__", "", Species)) %>%
  dplyr::mutate(Family = sub("f__", "", Family)) %>%
  dplyr::mutate(stars = cut(qval, breaks=c(-Inf, 0.001, 0.01, 0.1, Inf), label=c("***", "**", "*", "")) )
Fig3_Maaslin.1<- Results_MaasLin_Category_species_combined %>% 
  arrange(desc(Family), desc(Species)) %>%
  mutate(Species = fct_inorder(factor(Species))) %>% 
  ggplot(aes(x=analysis, y=Species, fill=coef), show.legend = T) + 
  geom_tile() + 
  scale_fill_gradient2(low="#D7191C", mid="white", high="#2C7BB6") + 
  geom_text(aes(label=stars), color = "black", size=3) + 
  labs(y=NULL, x=NULL, fill="coef") + 
  theme_classic(base_size = 10) +
  theme(legend.position = 'top')+
  theme(axis.text.y = element_text(face = "italic")) +
  theme(legend.key.height = unit(0.4, 'cm'), legend.key.width = unit(0.4, 'cm')) +
  scale_y_discrete(position = "right")

Fig3_Maaslin.2 <-  Results_MaasLin_Category_species_combined %>%
  arrange(desc(Family), desc(Species)) %>%
  mutate(Species = fct_inorder(factor(Species))) %>% 
  ggplot(aes(y=Species, x=0.1, fill = Family)) +
  scale_fill_manual(values = tableau_color_pal('Tableau 20')(19)) +
  geom_tile() +
  theme_void(base_size = 10) +
  theme(legend.position = 'none')

Fig3_Maaslin.legend <- cowplot::get_legend(Results_MaasLin_Category_species_combined %>%
  arrange(desc(Family), desc(Species)) %>%
  mutate(Species = fct_inorder(factor(Species))) %>% 
  ggplot(aes(y=Species, x=0.1, fill = Family)) +
  scale_fill_manual(values = tableau_color_pal('Tableau 20')(19)) +
  geom_tile() +
  theme_classic(base_size = 10) +
  theme(legend.position = 'left') +
  guides(fill=guide_legend(nrow=9, title.position="top")) + 
  theme(legend.key.size = unit(0.4, 'cm'), 
        legend.text=element_text(face = "italic")) +
  guides(fill=guide_legend(nrow=5,byrow=TRUE)))
Fig3_Maaslin <- Fig3_Maaslin.2 + Fig3_Maaslin.1  + plot_layout(widths = c(0.3, 1))
Fig3_Maaslin

Figure 3 - C. minuta effects on gut microbiome biomass and diversity.

Fig3_legend_treatment_sex <- cowplot::get_legend(metadata_Cmin %>% 
  dplyr::mutate(Sex = ifelse(Sex == "F", "Female", "Male"), 
                Category = ifelse(Category == "Killed", "Killed-CM", "Live-CM"), 
                Sex_Category = paste(Sex, Category, sep = " ")) %>%
  ggplot(aes(x = Category, y = qPCR_Cmin_per_gCC, shape = Sex_Category, color = Sex_Category)) + 
  geom_point(aes(shape = Sex_Category, color= Sex_Category), alpha =0.7, size =0.5, show.legend = T) +
  scale_shape_manual(values=c(16, 16,4, 4)) + 
  scale_color_manual(values=c(color_Category, color_Category)) +
  theme_classic(base_size = 10) +
  theme(legend.title=element_blank()) + 
  guides(shape=guide_legend(nrow=2, byrow=TRUE, 
                            override.aes = list(size = 3, alpha = 1))))

Fig3_align <- cowplot::align_plots(Fig3_qPCR_bacteria + theme(legend.position="none"),
                                       Fig3_Cmin_biomass + theme(legend.position="none"),
                                       Fig3_OF + theme(legend.position="none"),
                                       Fig3_SE + theme(legend.position="none"),
                                       Fig3_wUF + theme(legend.position="none"),
                                       Fig3_uwUF + theme(legend.position="none"),
                                       align = 'hv', axis = 'rlbt')
`geom_smooth()` using formula 'y ~ x'
Fig3_1 <- cowplot::plot_grid(Fig3_align[[1]],
                               Fig3_align[[2]],
                               Fig3_align[[3]],
                               Fig3_align[[4]],
                               Fig3_align[[5]],
                               Fig3_align[[6]],
                               ncol=2, nrow=3, labels = c( "A", "B", "C", "D", "E", "F"), label_size = 12, rel_widths = c(1, 1), rel_heights = c(1, 1, 1))

Fig3_2 <- cowplot::plot_grid(Fig3_legend_treatment_sex,
                               Fig3_Maaslin,
                               Fig3_Maaslin.legend,
                               ncol=1, nrow=3, labels = c(NA, "G", NA), label_size = 12, rel_heights = c(0.2, 1.5, 0.5))

Figure3 <- cowplot::plot_grid(Fig3_1, 
                               Fig3_2, 
                               ncol=2, nrow=1, rel_widths = c(1.3, 1))
Warning: Removed 1 rows containing missing values (geom_text).Warning: Removed 1 rows containing missing values (geom_text).
Figure3

ggsave("./Figure3.pdf", plot = Figure3, device = cairo_pdf,  
  width = 17 ,
  height = 14,
  units = "cm")

Figure S4 - C. minuta amendment resulted in lower complexity in males.

FigS4_barplot_legend <- cowplot::get_legend(FigS4_Taxa_barplot + theme(legend.position="bottom") )
FigS4_legend_treatment_sex <- cowplot::get_legend(metadata_Cmin %>% 
  dplyr::mutate(Sex = ifelse(Sex == "F", "Female", "Male"), 
                Category = ifelse(Category == "Killed", "Killed-CM", "Live-CM"), 
                Sex_Category = paste(Sex, Category, sep = " ")) %>%
  ggplot(aes(x = Category, y = qPCR_Cmin_per_gCC, shape = Sex_Category, color = Sex_Category)) + 
  geom_point(aes(shape = Sex_Category, color= Sex_Category), alpha =0.7, size =0.5, show.legend = T) +
  scale_shape_manual(values=c(16, 16,4, 4)) + 
  scale_color_manual(values=c(color_Category, color_Category)) +
  theme_classic(base_size = 10) +
  theme(legend.title=element_blank()) + 
  guides(shape=guide_legend(override.aes = list(size = 3, alpha = 1))) +
  theme(legend.position="bottom"))

FigS4_align <- cowplot::align_plots(FigS4_FDP + theme(legend.position="none"),
                                          FigS4_PE + theme(legend.position="none"),
                                          align = 'v', axis = 'l')

FigS4_1 <- cowplot::plot_grid(NA, 
                                  FigS4_Taxa_barplot + theme(legend.position="none"),
                                  ncol=2, nrow=1, rel_widths = c(0.1, 2),  labels = c( "A", NA), label_size = 12)
Warning: Cannot convert object of class logical into a grob.
FigS4_2 <- cowplot::plot_grid(FigS4_align[[1]],
                                    FigS4_align[[2]],
                                    ncol=2, nrow=1, rel_widths = c(1, 1),  labels = c("B","C"), label_size = 12)


FigureS4 <- cowplot::plot_grid(FigS4_1, 
                                  FigS4_barplot_legend,
                                    FigS4_2, 
                                  FigS4_legend_treatment_sex,
                                    ncol=1, nrow=4, rel_heights = c(1.6, 0.35, 1, 0.2))
Warning: Removed 1 rows containing missing values (geom_text).
FigureS4

ggsave("./FigureS4.pdf", plot = FigureS4, device = cairo_pdf,  
  width = 10.5,
  height = 13,
  units = "cm")

Amendment of C. minuta altered the host metabolome

SCFA

GCMS_SCFAs.2<- GCMS_SCFAs %>%
  dplyr::left_join(metadata, by = "MouseID")

Fig4_totalSCFA <- GCMS_SCFAs.2 %>% 
  ggplot(aes(x = Category, y = Total_SCFA, shape = Sex, color = Category)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Category), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_Category, label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Killed" = "Killed-\nCM", "Live" = "Live-\nCM")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  labs(y= "Total SCFAs (mM/g)") +
  theme(axis.text.x = element_text(face = "italic")) +
  facet_grid(.~Sex) +
  theme(strip.background = element_blank(),strip.text = element_blank()) 
Fig4_totalSCFA

set.seed(501)
GCMS_SCFAs.2$Total_SCFA_norm <- predict(bestNormalize(GCMS_SCFAs.2$Total_SCFA))

options(contrasts=c("contr.sum", "contr.poly"))
model_scfa<- lmer(Total_SCFA_norm ~ Category*Sex + Extraction_round + (Category|Sex/Batch) + (Category|Batch) + (1|Deriv), data = GCMS_SCFAs.2)
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -2.1e-07Warning: Model may not have converged with 1 eigenvalue close to zero: 3.5e-09
step(model_scfa)
boundary (singular) fit: see help('isSingular')
Warning: Model may not have converged with 2 eigenvalues close to zero: 3.1e-09 -1.4e-09boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -8.6e-04Warning: Model may not have converged with 1 eigenvalue close to zero: -6.8e-09boundary (singular) fit: see help('isSingular')
Warning: Model may not have converged with 2 eigenvalues close to zero: 3.1e-09 -1.4e-09boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -1.0e-06Warning: Model may not have converged with 2 eigenvalues close to zero: 8.6e-09 -2.3e-09boundary (singular) fit: see help('isSingular')
Warning: Model may not have converged with 2 eigenvalues close to zero: 3.1e-09 -1.4e-09boundary (singular) fit: see help('isSingular')
Warning: Model may not have converged with 1 eigenvalue close to zero: -8.4e-09boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -3.3e-03boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -9.4e-08Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvaluesWarning: Model may not have converged with 1 eigenvalue close to zero: 9.7e-11boundary (singular) fit: see help('isSingular')
Warning: Model may not have converged with 1 eigenvalue close to zero: -8.4e-09boundary (singular) fit: see help('isSingular')
Warning: Model may not have converged with 1 eigenvalue close to zero: 8.1e-09boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
Warning: Model may not have converged with 1 eigenvalue close to zero: -9.8e-10boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
Warning: Model may not have converged with 1 eigenvalue close to zero: -9.8e-10boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -2.3e-08boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 2 negative eigenvalues: -2.3e-08 -5.7e+01boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
Backward reduced random-effect table:

                                   Eliminated npar  logLik    AIC     LRT Df Pr(>Chisq)
<none>                                          17 -233.52 501.05                      
Category in (Category | Batch:Sex)          1   15 -233.52 497.05 0.00000  2     1.0000
Category in (Category | Sex)                2   13 -233.52 493.05 0.00000  2     1.0000
(1 | Batch:Sex)                             3   12 -233.52 491.05 0.00000  1     1.0000
(1 | Sex)                                   4   11 -233.52 489.05 0.00000  1     0.9999
Category in (Category | Batch)              5    9 -234.54 487.07 2.02774  2     0.3628
(1 | Batch)                                 6    8 -234.54 485.07 0.00000  1     1.0000
(1 | Deriv)                                 7    7 -234.87 483.73 0.65658  1     0.4178

Backward reduced fixed-effect table:
                 Eliminated Df Sum of Sq    RSS     AIC F value    Pr(>F)    
Extraction_round          0  2    51.800 176.15   1.018  36.867 4.124e-14 ***
Category:Sex              0  1     3.638 127.99 -55.434   5.178   0.02407 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
Total_SCFA_norm ~ Category + Sex + Extraction_round + Category:Sex
options(contrasts=c("contr.sum", "contr.poly"))
model_scfa.2<- lm(Total_SCFA_norm ~ Category + Sex + Extraction_round + Category:Sex, data = GCMS_SCFAs.2)
shapiro.test(residuals(model_scfa.2))

    Shapiro-Wilk normality test

data:  residuals(model_scfa.2)
W = 0.98942, p-value = 0.1924
anova(lm(residuals(model_scfa.2)~fitted.values(model_scfa.2)))
Analysis of Variance Table

Response: residuals(model_scfa.2)
                             Df Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_scfa.2)   1   0.00 0.00000       0      1
Residuals                   181 124.35 0.68701               
par(mfrow=c(2,2))
plot(model_scfa.2)

GCMS_SCFAs_M <- GCMS_SCFAs.2 %>% dplyr::filter(Sex =="M")
GCMS_SCFAs_F <- GCMS_SCFAs.2 %>% dplyr::filter(Sex =="F")

model_scfa_m <- lm(Total_SCFA_norm ~ Category + Extraction_round, data = GCMS_SCFAs_M)
model_scfa_f <- lm(Total_SCFA_norm ~ Category + Extraction_round, data = GCMS_SCFAs_F)

shapiro.test(residuals(model_scfa_m))

    Shapiro-Wilk normality test

data:  residuals(model_scfa_m)
W = 0.98536, p-value = 0.4111
shapiro.test(residuals(model_scfa_f))

    Shapiro-Wilk normality test

data:  residuals(model_scfa_f)
W = 0.99216, p-value = 0.8629
anova(lm(residuals(model_scfa_m)~fitted.values(model_scfa_m)))
Analysis of Variance Table

Response: residuals(model_scfa_m)
                            Df Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_scfa_m)  1  0.000  0.0000       0      1
Residuals                   88 73.013  0.8297               
anova(lm(residuals(model_scfa_f)~fitted.values(model_scfa_f)))
Analysis of Variance Table

Response: residuals(model_scfa_f)
                            Df Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_scfa_f)  1  0.000 0.00000       0      1
Residuals                   91 49.676 0.54589               
car::Anova(model_scfa_m, test.statistic="F", type = "II")
Anova Table (Type II tests)

Response: Total_SCFA_norm
                 Sum Sq Df F value    Pr(>F)    
Category          1.989  1  2.3426    0.1296    
Extraction_round 19.815  2 11.6696 3.282e-05 ***
Residuals        73.013 86                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
car::Anova(model_scfa_f, test.statistic="F", type = "II")
Anova Table (Type II tests)

Response: Total_SCFA_norm
                 Sum Sq Df F value    Pr(>F)    
Category          1.499  1  2.6851    0.1048    
Extraction_round 33.646  2 30.1403 1.011e-10 ***
Residuals        49.676 89                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
model_scfa_meff <- lm(Total_SCFA ~ Category + Extraction_round, data = GCMS_SCFAs_M)
model_scfa_feff <- lm(Total_SCFA ~ Category + Extraction_round, data = GCMS_SCFAs_F)

effects::effect("Category", model_scfa_meff, se=TRUE) %>% as.data.frame
effects::effect("Category", model_scfa_feff, se=TRUE) %>% as.data.frame
SCFA_F <- GCMS_SCFAs.2 %>% 
  dplyr::filter(Sex =="F") %>%
  dplyr::select(MouseID, Acetate:Caproate, Propionate:Valerate) %>%
  tibble::column_to_rownames(var = "MouseID") 

SCFA_M <- GCMS_SCFAs.2 %>% 
  dplyr::filter(Sex =="M") %>%
  dplyr::select(MouseID, Acetate:Caproate, Propionate:Valerate) %>%
  tibble::column_to_rownames(var = "MouseID") 

SCFA_F_meta <- GCMS_SCFAs.2 %>% 
  dplyr::filter(Sex =="F") %>%
  tibble::column_to_rownames(var = "MouseID") 

SCFA_M_meta <- GCMS_SCFAs.2 %>% 
  dplyr::filter(Sex =="M") %>%
  tibble::column_to_rownames(var = "MouseID") 

options(backup_options)

SCFA_F = Maaslin2(
    input_data = SCFA_F, 
    input_metadata = SCFA_F_meta, 
    output = "./data/Interim_output/SCFA_F", 
    fixed_effects = c("Category", "Extraction_round"),
    reference = c("Extraction_round,E1"),
    random_effects = c("Batch"), 
    min_prevalence = FALSE,
    min_abundance = FALSE,
    min_variance = FALSE, 
    analysis_method = "LM", 
    max_significance = 0.1)

SCFA_M = Maaslin2(
    input_data = SCFA_M, 
    input_metadata = SCFA_M_meta, 
    output = "./data/Interim_output/SCFA_M", 
    fixed_effects = c("Category", "Extraction_round"), 
    reference = c("Extraction_round,E1"),
    random_effects = c("Batch"), 
    min_prevalence = FALSE,
    min_abundance = FALSE,
    min_variance = FALSE,
    max_significance = 0.1)
SCFA_F_results <- fread("./data/Interim_output/SCFA_F/all_results.tsv")
SCFA_M_results <-fread("./data/Interim_output/SCFA_M/all_results.tsv")
SCFA_F_treat <- SCFA_F_results %>%
  dplyr::filter(metadata == "Category") %>%
  dplyr::mutate(qval2 = p.adjust(pval, method= "BH")) %>%
  dplyr::arrange(qval2)

SCFA_M_treat <-SCFA_M_results %>%
  dplyr::filter(metadata == "Category") %>%
  dplyr::mutate(qval2 = p.adjust(pval, method= "BH")) %>%
  dplyr::arrange(qval2) 
SCFA_F_treat
SCFA_M_treat
Fig4_butyrate <- GCMS_SCFAs.2 %>%
  ggplot(aes(x = Category, y = Butyrate, shape = Sex, color = Category)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Category), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_Category, label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Killed" = "Killed-\nCM", "Live" = "Live-\nCM")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  labs(y= "Butyrate (mM/g)") +
  theme(axis.text.x = element_text(face = "italic")) +
  facet_grid(.~Sex) +
  theme(strip.background = element_blank(),strip.text = element_blank()) 
Fig4_butyrate


FigS5_SCFAs <- GCMS_SCFAs.2 %>%
  dplyr::mutate(Sex_Category =paste (Sex, Category, sep ="_")) %>%
  dplyr::select(Category,Sex_Category, Batch, Sex, Acetate, Propionate, Valerate, Caproate) %>%
  tidyr::gather(SCFA, measurement, c(Acetate:Caproate)) %>%
  ggplot(aes(x = Category, y = measurement, shape = Sex, color = Category)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Category), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_Category, label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Killed" = "K", "Live" = "L")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  labs(y = "Conc. (mM/g)") +
  theme(axis.title.x=element_blank()) +
  ggh4x::facet_nested_wrap(~ SCFA + Sex, scales ="free_y",ncol =4, labeller=function(x) {x[1]}) +
  theme(legend.position="bottom") +
  theme(axis.text.x = element_text(face = "italic")) +
  theme(strip.background = element_blank())
FigS5_SCFAs

options(contrasts=c("contr.sum", "contr.poly"))

set.seed(193)

SCFA_activity <- Promethion_activity %>%
  dplyr::select(MouseID, Distance_traveled, Beam_breaks, Promethion_Cabinet) %>% 
  dplyr::left_join(GCMS_SCFAs.2, by ="MouseID") %>% 
  drop_na(Distance_traveled, Total_SCFA) %>%
  dplyr::mutate(Distance_traveled_norm = predict(bestNormalize::boxcox(Distance_traveled)), 
                Beam_breaks_norm = predict(bestNormalize(Beam_breaks)), 
                Total_SCFA_norm = predict(bestNormalize(Total_SCFA)), 
                Butyrate_norm = predict(bestNormalize(Butyrate)))
model_scfa_dist <- lmerTest::lmer(Distance_traveled_norm ~ Total_SCFA_norm*Extraction_round*Sex  + (1|Batch), data = SCFA_activity)
lmerTest::step(model_scfa_dist)
Backward reduced random-effect table:

            Eliminated npar  logLik    AIC    LRT Df Pr(>Chisq)    
<none>                   14 -228.88 485.76                         
(1 | Batch)          0   13 -251.14 528.29 44.524  1  2.512e-11 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Backward reduced fixed-effect table:
Degrees of freedom method: Satterthwaite 

                                     Eliminated Sum Sq Mean Sq NumDF  DenDF F value  Pr(>F)   
Total_SCFA_norm:Extraction_round:Sex          1 0.8478  0.4239     2 162.03  0.7677 0.46576   
Total_SCFA_norm:Sex                           2 0.0004  0.0004     1 164.00  0.0008 0.97749   
Extraction_round:Sex                          3 1.4297  0.7149     2 165.43  1.3066 0.27352   
Total_SCFA_norm:Extraction_round              4 1.8666  0.9333     2 166.98  1.7020 0.18546   
Extraction_round                              5 0.3233  0.1616     2 169.54  0.2923 0.74694   
Total_SCFA_norm                               0 4.9167  4.9167     1 170.97  8.9651 0.00316 **
Sex                                           0 2.9302  2.9302     1  10.07  5.3429 0.04323 * 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
Distance_traveled_norm ~ Total_SCFA_norm + Sex + (1 | Batch)
model_scfa_bb <- lmerTest::lmer(Beam_breaks_norm ~ Total_SCFA_norm*Extraction_round*Sex  + (1|Batch), data = SCFA_activity)
lmerTest::step(model_scfa_bb)
Backward reduced random-effect table:

            Eliminated npar  logLik   AIC    LRT Df Pr(>Chisq)    
<none>                   14 -232.45 492.9                         
(1 | Batch)          0   13 -255.55 537.1 46.201  1  1.067e-11 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Backward reduced fixed-effect table:
Degrees of freedom method: Satterthwaite 

                                     Eliminated  Sum Sq Mean Sq NumDF   DenDF F value  Pr(>F)  
Total_SCFA_norm:Extraction_round:Sex          1 0.87087 0.43543     2 161.945  0.7578 0.47033  
Total_SCFA_norm:Sex                           2 0.22280 0.22280     1 163.949  0.3886 0.53390  
Total_SCFA_norm:Extraction_round              3 1.31935 0.65967     2 164.972  1.1550 0.31758  
Extraction_round:Sex                          4 1.37177 0.68589     2 167.475  1.1965 0.30483  
Extraction_round                              5 0.02677 0.01339     2 169.548  0.0233 0.97694  
Sex                                           6 2.76604 2.76604     1  10.085  4.8772 0.05148 .
Total_SCFA_norm                               0 3.12751 3.12751     1 170.725  5.5135 0.02002 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
Beam_breaks_norm ~ Total_SCFA_norm + (1 | Batch)
model_ba_dist <- lmerTest::lmer(Distance_traveled_norm ~ Butyrate_norm*Extraction_round*Sex  + (1|Batch), data = SCFA_activity)
lmerTest::step(model_ba_dist)
Backward reduced random-effect table:

            Eliminated npar  logLik    AIC    LRT Df Pr(>Chisq)    
<none>                   14 -232.69 493.39                         
(1 | Batch)          0   13 -255.23 536.46 45.071  1  1.901e-11 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Backward reduced fixed-effect table:
Degrees of freedom method: Satterthwaite 

                                   Eliminated Sum Sq Mean Sq NumDF   DenDF F value Pr(>F)  
Butyrate_norm:Extraction_round:Sex          1 0.7659  0.3829     2 162.262  0.6660 0.5152  
Butyrate_norm:Extraction_round              2 0.1445  0.0722     2 164.499  0.1262 0.8816  
Butyrate_norm:Sex                           3 0.2885  0.2885     1 163.142  0.5092 0.4765  
Butyrate_norm                               4 0.0787  0.0787     1 174.868  0.1392 0.7095  
Extraction_round:Sex                        5 1.5838  0.7919     2 168.519  1.4065 0.2479  
Extraction_round                            6 2.5251  1.2626     2 170.321  2.2353 0.1101  
Sex                                         0 3.2516  3.2516     1  10.045  5.6720 0.0384 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
Distance_traveled_norm ~ Sex + (1 | Batch)
model_ba_bb<- lmerTest::lmer(Beam_breaks_norm ~ Butyrate_norm*Extraction_round*Sex  + (1|Batch), data = SCFA_activity)
lmerTest::step(model_ba_bb)
Backward reduced random-effect table:

            Eliminated npar  logLik    AIC    LRT Df Pr(>Chisq)    
<none>                   14 -233.53 495.07                         
(1 | Batch)          0   13 -256.59 539.17 46.101  1  1.123e-11 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Backward reduced fixed-effect table:
Degrees of freedom method: Satterthwaite 

                                   Eliminated  Sum Sq Mean Sq NumDF   DenDF F value  Pr(>F)  
Butyrate_norm:Extraction_round:Sex          1 0.64013 0.32007     2 162.243  0.5516 0.57708  
Butyrate_norm:Sex                           2 0.06526 0.06526     1 161.795  0.1130 0.73716  
Extraction_round:Sex                        3 1.40754 0.70377     2 165.761  1.2243 0.29660  
Butyrate_norm:Extraction_round              4 2.55699 1.27849     2 167.457  2.2231 0.11146  
Extraction_round                            5 0.60806 0.30403     2 170.037  0.5207 0.59507  
Butyrate_norm                               6 0.56762 0.56762     1 178.554  0.9773 0.32421  
Sex                                         0 3.01315 3.01315     1  10.062  5.1850 0.04586 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
Beam_breaks_norm ~ Sex + (1 | Batch)

-> Only total SCFA correlate to activity. Butyrate doesnt.

options(contrasts=c("contr.sum", "contr.poly"))

model_scfa_dis.2 <- lmerTest::lmer(Distance_traveled_norm ~ Total_SCFA_norm + Sex + (1 | Batch), data = SCFA_activity)
shapiro.test(residuals(model_scfa_dis.2))

    Shapiro-Wilk normality test

data:  residuals(model_scfa_dis.2)
W = 0.99107, p-value = 0.3196
anova(lm(residuals(model_scfa_dis.2)~fitted.values(model_scfa_dis.2)))
Analysis of Variance Table

Response: residuals(model_scfa_dis.2)
                                 Df Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_scfa_dis.2)   1  0.308 0.30791  0.5962  0.441
Residuals                       180 92.962 0.51646               
model_scfa_bb.2 <- lmerTest::lmer(Beam_breaks_norm ~ Total_SCFA_norm + Sex + (1 | Batch), data = SCFA_activity)
shapiro.test(residuals(model_scfa_bb.2))

    Shapiro-Wilk normality test

data:  residuals(model_scfa_bb.2)
W = 0.99543, p-value = 0.8563
anova(lm(residuals(model_scfa_bb.2)~fitted.values(model_scfa_bb.2)))
Analysis of Variance Table

Response: residuals(model_scfa_bb.2)
                                Df Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_scfa_bb.2)   1  0.345 0.34492   0.646 0.4226
Residuals                      180 96.106 0.53392               
model_ba_dist.2 <- lmerTest::lmer(Distance_traveled_norm ~ Butyrate_norm + Sex + (1 | Batch), data = SCFA_activity)
shapiro.test(residuals(model_ba_dist.2))

    Shapiro-Wilk normality test

data:  residuals(model_ba_dist.2)
W = 0.99184, p-value = 0.3966
anova(lm(residuals(model_ba_dist.2)~fitted.values(model_ba_dist.2)))
Analysis of Variance Table

Response: residuals(model_ba_dist.2)
                                Df Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_ba_dist.2)   1  0.351 0.35117  0.6529 0.4201
Residuals                      180 96.810 0.53783               
model_ba_bb.2 <- lmerTest::lmer(Beam_breaks_norm ~ Butyrate_norm + Sex + (1 | Batch), data = SCFA_activity)
shapiro.test(residuals(model_ba_bb.2))

    Shapiro-Wilk normality test

data:  residuals(model_ba_bb.2)
W = 0.99259, p-value = 0.4834
anova(lm(residuals(model_ba_bb.2)~fitted.values(model_ba_bb.2)))
Analysis of Variance Table

Response: residuals(model_ba_bb.2)
                              Df Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_ba_bb.2)   1  0.371 0.37139  0.6792  0.411
Residuals                    180 98.427 0.54682               
plot(model_scfa_dis.2)

plot(model_scfa_bb.2)


plot(model_ba_dist.2)

plot(model_ba_bb.2)

car::Anova(model_scfa_dis.2, test.statistic ="F", type ="II")
Analysis of Deviance Table (Type II Wald F tests with Kenward-Roger df)

Response: Distance_traveled_norm
                     F Df  Df.res   Pr(>F)   
Total_SCFA_norm 8.9427  1 170.926 0.003197 **
Sex             5.3429  1  10.011 0.043373 * 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
car::Anova(model_scfa_bb.2, test.statistic ="F", type ="II")
Analysis of Deviance Table (Type II Wald F tests with Kenward-Roger df)

Response: Beam_breaks_norm
                     F Df  Df.res  Pr(>F)  
Total_SCFA_norm 5.2656  1 170.924 0.02297 *
Sex             4.8772  1  10.011 0.05167 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
car::Anova(model_ba_dist.2, test.statistic ="F", type ="II")
Analysis of Deviance Table (Type II Wald F tests with Kenward-Roger df)

Response: Distance_traveled_norm
                   F Df  Df.res  Pr(>F)  
Butyrate_norm 1.3875  1 178.519 0.24040  
Sex           5.6767  1   9.922 0.03863 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
car::Anova(model_ba_bb.2, test.statistic ="F", type ="II")
Analysis of Deviance Table (Type II Wald F tests with Kenward-Roger df)

Response: Beam_breaks_norm
                   F Df  Df.res  Pr(>F)  
Butyrate_norm 0.9599  1 178.547 0.32854  
Sex           5.2176  1   9.921 0.04566 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
set.seed(763)
r2_model_scfa_dis_mar<- partR2(model_scfa_dis.2, partvars = c("Total_SCFA_norm"), R2_type = "marginal", nboot = 10)

  |                                                  | 0 % ~calculating  
  |+++++                                             | 10% ~01s          
  |++++++++++                                        | 20% ~01s          
  |+++++++++++++++                                   | 30% ~01s          
  |++++++++++++++++++++                              | 40% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++++++                    | 60% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
r2_model_scfa_dis_mar$R2 %>% dplyr::filter(term == "Total_SCFA_norm") %>% dplyr::select(estimate) %>% pull()
[1] 0.02828478
r2_model_scfa_bb_mar <- partR2(model_scfa_bb.2, partvars = c("Total_SCFA_norm"), R2_type = "marginal", nboot = 10)

  |                                                  | 0 % ~calculating  
  |+++++                                             | 10% ~01s          
  |++++++++++                                        | 20% ~01s          
  |+++++++++++++++                                   | 30% ~01s          
  |++++++++++++++++++++                              | 40% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++++++                    | 60% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
r2_model_scfa_bb_mar$R2 %>% dplyr::filter(term == "Total_SCFA_norm") %>% dplyr::select(estimate) %>% pull()
[1] 0.01728646
r2_model_ba_dist_mar<- partR2(model_ba_dist.2, partvars = c("Butyrate_norm"), R2_type = "marginal", nboot = 10)

  |                                                  | 0 % ~calculating  
  |+++++                                             | 10% ~01s          
  |++++++++++                                        | 20% ~01s          
  |+++++++++++++++                                   | 30% ~01s          
  |++++++++++++++++++++                              | 40% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++++++                    | 60% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
r2_model_ba_dist_mar$R2 %>% dplyr::filter(term == "Butyrate_norm") %>% dplyr::select(estimate) %>% pull()
[1] 0.005993161
r2_model_ba_bb_mar<- partR2(model_ba_bb.2, partvars = c("Butyrate_norm"), R2_type = "marginal", nboot = 10)

  |                                                  | 0 % ~calculating  
  |+++++                                             | 10% ~01s          
  |++++++++++                                        | 20% ~01s          
  |+++++++++++++++                                   | 30% ~01s          
  |++++++++++++++++++++                              | 40% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++++++                    | 60% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
r2_model_ba_bb_mar$R2 %>% dplyr::filter(term == "Butyrate_norm") %>% dplyr::select(estimate) %>% pull()
[1] 0.004242537
#residuals
model_ba_scfa_dist_resid <- lmerTest::lmer(Distance_traveled_norm ~  Sex + (1 | Batch), data = SCFA_activity)
model_ba_scfa_bb_resid <- lmerTest::lmer(Beam_breaks_norm ~ Sex + (1 | Batch), data = SCFA_activity)

SCFA_activity <- SCFA_activity %>%
  dplyr::mutate(Distance_traveled_resid = residuals(model_ba_scfa_dist_resid)/sigma(model_ba_scfa_dist_resid), 
                Beam_breaks_resid = residuals(model_ba_scfa_bb_resid)/sigma(model_ba_scfa_bb_resid))
Fig4_tscfa_distance <- SCFA_activity %>%
  ggplot(aes(x= Total_SCFA_norm ,y=Distance_traveled_resid)) +
  geom_point(aes(shape = Sex, color = Category), alpha =0.7, size =0.6, show.legend = T) +
  scale_shape_manual(values=shape_Sex, label = c("Female", "Male"),name = "Sex") + 
  scale_color_manual(values=color_Category, label = c(expression(italic("Killed-CM")), expression(italic("Live-CM"))), name = "Treatment") +
  geom_smooth(method = "lm", se = F,  alpha = 0.8, size = 0.5, color = "black")+ 
  theme_classic(base_size = 10) +
  labs(y= "Adj. distance traveled", x = "Norm. total SCFAs")
Fig4_tscfa_distance


FigS5_butyrate_beambreaks<- SCFA_activity%>%
  ggplot(aes(x= Butyrate_norm ,y=Beam_breaks_resid)) +
  geom_point(aes(shape = Sex, color = Category), alpha =0.7, size =0.75, show.legend = T) +
  scale_shape_manual(values=shape_Sex, label = c("Female", "Male"),name = "Sex") + 
  scale_color_manual(values=color_Category, label = c(expression(italic("Killed-CM")), expression(italic("Live-CM"))), name = "Treatment") +
  geom_smooth(method = "lm", se = F,  alpha = 0.8, size = 0.5, color = "black")+ 
  theme_classic(base_size = 10) +
  labs(y= "Adj. beam breaks", x = "Norm. butyrate")
FigS5_butyrate_beambreaks


FigS5_tscfa_beambreaks <- SCFA_activity%>%
  ggplot(aes(x= Total_SCFA_norm ,y=Beam_breaks_resid)) +
  geom_point(aes(shape = Sex, color = Category), alpha =0.7, size =0.6, show.legend = T) +
  scale_shape_manual(values=shape_Sex, label = c("Female", "Male"),name = "Sex") + 
  scale_color_manual(values=color_Category, label = c(expression(italic("Killed-CM")), expression(italic("Live-CM"))), name = "Treatment") +
  geom_smooth(method = "lm", se = F,  alpha = 0.8, size = 0.5, color = "black")+ 
  theme_classic(base_size = 10) +
  labs(y= "Adj. beam breaks", x = "Norm. total SCFA")
FigS5_tscfa_beambreaks


Fig4_butyrate_distance <- SCFA_activity %>%
  ggplot(aes(x= Butyrate_norm ,y=Distance_traveled_resid)) +
  geom_point(aes(shape = Sex, color = Category), alpha =0.7, size =0.6, show.legend = T) +
  scale_shape_manual(values=shape_Sex, label = c("Female", "Male"),name = "Sex") + 
  scale_color_manual(values=color_Category, label = c(expression(italic("Killed-CM")), expression(italic("Live-CM"))), name = "Treatment") +
  geom_smooth(method = "lm", se = F,  alpha = 0.8, size = 0.5, color = "black")+ 
  theme_classic(base_size = 10) +
  labs(y= "Adj. distance traveled", x = "Norm. butyrate") 
Fig4_butyrate_distance

targeted serum metabolites (LC_MS)

LCMS_serum.2 <- LCMS_serum %>%
  dplyr::filter(Sampletype == "Sample") %>%
  dplyr::mutate(GluA_Glu_ratio = Glutamic_acid/Glutamine) %>%
  tidyr::separate(sampleid, sep ="_", into = c("Metabolomics_Run", NA, NA), remove = FALSE) %>%
  dplyr::left_join(metadata, by ="MouseID")%>%
  dplyr::select(-Cortisol) # signal too weak
LCMS_serum.2 %>%
  tidyr::gather(molecule, conc_area, Corticosterone:GABA) %>%
  dplyr::mutate(Sex_Category = paste(Sex, Category, sep = "_")) %>%
  ggplot(aes(x= Sex_Category ,y= conc_area, fill=factor(Category))) +
  geom_boxplot(alpha =0.7, outlier.shape = NA) + 
  scale_fill_manual(values=color_Category, label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  labs(fill = "Category") + 
  geom_point(alpha =0.7, size =0.5, position=position_jitterdodge(jitter.width=0.7),
             show.legend = T) +
  theme_classic(base_size = 11) + 
  theme(axis.title.x=element_blank()) +
  theme(legend.position="bottom") +
  scale_y_continuous(labels = function(x) format(x, scientific = TRUE)) +
  facet_wrap(molecule~., scales = "free", ncol = 4) +
  scale_x_discrete(labels=c("F\nKilled-\nCM", "F\nLive-\nCM", "M\nKilled-\nCM", "M\nLive-\nCM")) 

LCMS_serum_F <- LCMS_serum.2 %>%
  dplyr::filter(Sex == "F")
LCMS_serum_M <- LCMS_serum.2 %>%
  dplyr::filter(Sex == "M")

LCMS_serum_F_metabolites <- LCMS_serum_F %>%
  dplyr::select(sampleid, Corticosterone:GABA) %>%
  tibble::column_to_rownames(var ="sampleid")

LCMS_serum_M_metabolites <- LCMS_serum_M %>%
  dplyr::select(sampleid, Corticosterone:GABA) %>%
  tibble::column_to_rownames(var ="sampleid")

LCMS_serum_F_metadata <- LCMS_serum_F %>%
  dplyr::select(sampleid, MouseID, Metabolomics_Run, Batch, Category) %>%
  tibble::column_to_rownames(var ="sampleid")

LCMS_serum_M_metadata <- LCMS_serum_M %>%
  dplyr::select(sampleid, MouseID, Metabolomics_Run, Batch, Category) %>%
  tibble::column_to_rownames(var ="sampleid")

options(backup_options)

Maaslin_LCMS_F = Maaslin2(
    input_data = LCMS_serum_F_metabolites, 
    input_metadata = LCMS_serum_F_metadata, 
    output = "./data/Interim_output/Maaslin_LCMS_F", 
    fixed_effects = c("Category", "Metabolomics_Run"), 
    random_effects = c("Batch"), 
    min_prevalence = 0.7, 
    max_significance = 0.15)
Maaslin_LCMS_M = Maaslin2(
    input_data = LCMS_serum_M_metabolites, 
    input_metadata = LCMS_serum_M_metadata, 
    output = "./data/Interim_output/Maaslin_LCMS_M", 
    fixed_effects = c("Category", "Metabolomics_Run"), 
    random_effects = c("Batch"), 
    min_prevalence = 0.7, 
    max_significance = 0.15)
Maaslin_LCMS_F_results <- fread("./data/Interim_output/Maaslin_LCMS_F/all_results.tsv")
Maaslin_LCMS_M_results <- fread("./data/Interim_output/Maaslin_LCMS_M/all_results.tsv")

Maaslin_LCMS_F_results.2 <- Maaslin_LCMS_F_results %>%
  dplyr::filter(metadata == "Category") %>%
  dplyr::mutate(qval2 = p.adjust(pval, method = "BH")) %>%
  dplyr::arrange(qval2) 
Maaslin_LCMS_F_results.2

Maaslin_LCMS_M_results.2 <-Maaslin_LCMS_M_results %>%
  dplyr::filter(metadata == "Category") %>%
  dplyr::mutate(qval2 = p.adjust(pval, method = "BH")) %>%
  dplyr::arrange(qval2) 
Maaslin_LCMS_M_results.2
Fig4_Corticosterone <- LCMS_serum.2 %>% 
  dplyr::mutate(Corticosterone_10x4 = Corticosterone/10000) %>%
  ggplot(aes(x = Category, y = Corticosterone_10x4, shape = Sex, color = Category)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Category), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_Category, label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Killed" = "Killed-\nCM", "Live" = "Live-\nCM")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  labs(y ="Corticosterone\n(PA) x e4") +
  theme(axis.text.x = element_text(face = "italic")) +
  facet_grid(.~Sex , scales ="free") +
  theme(strip.background = element_blank(),strip.text = element_blank()) 
Fig4_Corticosterone


FigS5_LCMS <- LCMS_serum.2 %>% 
  dplyr::mutate(Sex_Category =paste (Sex, Category, sep ="_")) %>%
  dplyr::select(Category, Sex_Category, Batch, Sex, Glutamic_acid, Glutamine, Histamine, Indolelactic_acid, Kynurenine, Thyroxine, Serotonin, Tryptophan, Kynurenic_acid, GABA) %>%
  dplyr::rename(Glu = Glutamic_acid, Gln = Glutamine, ILA = Indolelactic_acid, KYN = Kynurenine, T4 = Thyroxine, KYNA = Kynurenic_acid) %>% 
  tidyr::gather(metabolite, measurement, c(Glu:GABA)) %>%
  dplyr::mutate(measurement = as.numeric(measurement)) %>%
  dplyr::mutate(measurement_10x4 = measurement/10000) %>%
  ggplot(aes(x = Category, y = measurement_10x4, shape = Sex, color = Category)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Category), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_Category, label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Killed" = "K", "Live" = "L")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  labs(y = expression(paste("(PA/ml) x ", e^4))) +
  theme(axis.title.x=element_blank()) +
  ggh4x::facet_nested_wrap(~ metabolite + Sex, scales ="free_y", ncol =10, labeller=function(x) {x[1]}) +
  theme(legend.position="bottom") +
  theme(axis.text.x = element_text(face = "italic")) +
  theme(strip.background = element_blank())
FigS5_LCMS

untargeted serum metabolites (LC_MS)

Maaslin_ee <- Promethion_activity_ee.2_MF %>%
  dplyr::select(MouseID, EE_average_per_hour_residual) 

Maaslin_metadata <- LCMS_serum.2 %>% dplyr::select(sampleid, MouseID, Category, Sex, Batch, Metabolomics_Run)

xcms_peaklist <- LCMS_xcms_output %>%
  dplyr::select(mzmed, rtmed, R3_S11_6456:R3_S9_6438, R1_S13_5916:R1_S9_6189) %>% 
  dplyr::mutate(Sample = paste(mzmed, rtmed, sep ="/")) %>%
  dplyr::select(Sample, R3_S11_6456:R1_S9_6189, -R3_S37_6420) 


xcms_metadata <- xcms_peaklist %>% 
  tidyr::gather(var, value, -Sample) %>% 
  tidyr::spread(Sample, value) %>%
  dplyr::rename(sampleid = var) %>%
  dplyr::select(sampleid) %>%
  dplyr::left_join(Maaslin_metadata, by ="sampleid") %>%
  dplyr::left_join(Maaslin_ee, by ="MouseID") %>%
  dplyr::select(sampleid, Category, Sex, Batch, EE_average_per_hour_residual, Metabolomics_Run) 

xcms_metadata_F <- xcms_metadata %>% 
  dplyr::filter(Sex == "F")
xcms_metadata_M <- xcms_metadata %>% 
  dplyr::filter(Sex == "M")

females <- xcms_metadata_F %>% pull(sampleid)
males <- xcms_metadata_M %>% pull(sampleid)

xcms_peaklist_F <- xcms_peaklist %>% 
  dplyr::select(Sample, contains(females)) %>%
  dplyr::rename(sampleid = Sample)
xcms_peaklist_M <-xcms_peaklist %>% 
  dplyr::select(Sample, contains(males))%>%
  dplyr::rename(sampleid = Sample)

xcms_peaklist_F2 <- xcms_peaklist_F %>%
  dplyr::mutate(sampleid = sub('/', '_rt', sampleid)) %>%
  dplyr::mutate(sampleid = paste("mz", sampleid, sep = "")) %>%
  dplyr::rowwise() %>%
  dplyr::mutate(row_mean = mean(R1_S10_6303:R3_S9_6438)) %>% # create a row with mean intensity of peak
  dplyr::ungroup() %>% 
  dplyr::slice_max(row_mean, n = 5000) %>% # select top 5000 peaks according to mean intensity
  dplyr::select(-row_mean) %>%
  column_to_rownames(var = "sampleid") %>%
  dplyr::select(sort(names(.)))
xcms_metadata_F2 <- xcms_metadata_F %>%
  dplyr::arrange(sampleid) %>%
  column_to_rownames(var = "sampleid")

xcms_peaklist_M2 <- xcms_peaklist_M %>%
  dplyr::mutate(sampleid = sub('/', '_rt', sampleid)) %>%
  dplyr::mutate(sampleid = paste("mz", sampleid, sep = "")) %>%
  dplyr::rowwise() %>%
  dplyr::mutate(row_mean = mean(R1_S1_6342:R3_S8_6382)) %>% # create a row with mean intensity of peak
  dplyr::ungroup() %>% 
  dplyr::slice_max(row_mean, n = 5000) %>% # select top 5000 peaks according to mean intensity
  dplyr::select(-row_mean) %>%
  column_to_rownames(var = "sampleid") %>%
  dplyr::select(sort(names(.)))
xcms_metadata_M2 <- xcms_metadata_M %>%
  dplyr::arrange(sampleid) %>%
  column_to_rownames(var = "sampleid")

options(backup_options)

Xcms_Maaslin_F = Maaslin2(
    input_data = xcms_peaklist_F2, 
    input_metadata = xcms_metadata_F2, 
    output = "./data/Interim_output/Xcms_Maaslin_F", 
    fixed_effects = c("Category", "Metabolomics_Run"), 
    random_effects = c("Batch"), 
    min_prevalence = 0.7, 
    max_significance = 0.1, 
    plot_heatmap = FALSE, 
    plot_scatter = FALSE)

Xcms_Maaslin_M = Maaslin2(
    input_data = xcms_peaklist_M2, 
    input_metadata = xcms_metadata_M2, 
    output = "./data/Interim_output/Xcms_Maaslin_M", 
    fixed_effects = c("Category", "Metabolomics_Run"), 
    random_effects = c("Batch"), 
    min_prevalence = 0.7, 
    max_significance = 0.1, 
    plot_heatmap = FALSE, 
    plot_scatter = FALSE)

Xcms_Maaslin_F_EE = Maaslin2(
    input_data = xcms_peaklist_F2, 
    input_metadata = xcms_metadata_F2, 
    output = "./data/Interim_output/Xcms_Maaslin_F_EE", 
    fixed_effects = c("EE_average_per_hour_residual", "Metabolomics_Run"), 
    random_effects = c("Batch"), 
    min_prevalence = 0.7, 
    max_significance = 0.1, 
    plot_heatmap = FALSE, 
    plot_scatter = FALSE)

Xcms_Maaslin_M_EE = Maaslin2(
    input_data = xcms_peaklist_M2, 
    input_metadata = xcms_metadata_M2, 
    output = "./data/Interim_output/Xcms_Maaslin_M_EE", 
    fixed_effects = c("EE_average_per_hour_residual", "Metabolomics_Run"), 
    random_effects = c("Batch"), 
    min_prevalence = 0.7, 
    max_significance = 0.1, 
    plot_heatmap = FALSE, 
    plot_scatter = FALSE)
Xcms_Maaslin_F_results<- fread("./data/Interim_output/Xcms_Maaslin_F/all_results.tsv")
Xcms_Maaslin_M_results<- fread("./data/Interim_output/Xcms_Maaslin_M/all_results.tsv")

Xcms_Maaslin_F_EE_results<- fread("./data/Interim_output/Xcms_Maaslin_F_EE/all_results.tsv")
Xcms_Maaslin_M_EE_results<- fread("./data/Interim_output/Xcms_Maaslin_M_EE/all_results.tsv")
#Treatment
Xcms_Maaslin_F_stats <-Xcms_Maaslin_F_results %>% 
  as.data.frame() %>%
  dplyr::filter(metadata == "Category") %>%
  dplyr::mutate(t.score = coef/stderr) %>% 
  tidyr::separate(feature, sep = "_rt", into = c("m.z", "r.t")) %>%
  dplyr::mutate(m.z = sub("mz", "", m.z)) %>%
  dplyr::mutate(qval2 = p.adjust(pval, method = "BH")) %>%
  dplyr::rename(p.value = qval2) %>%
  dplyr::arrange(p.value) %>%
  dplyr::select(m.z, r.t, p.value, t.score)

Xcms_Maaslin_M_stats <-Xcms_Maaslin_M_results %>% 
  as.data.frame() %>%
  dplyr::filter(metadata == "Category") %>%
  dplyr::mutate(t.score = coef/stderr) %>% 
  tidyr::separate(feature, sep = "_rt", into = c("m.z", "r.t")) %>%
  dplyr::mutate(m.z = sub("mz", "", m.z)) %>%
  dplyr::mutate(qval2 = p.adjust(pval, method = "BH")) %>%
  dplyr::rename(p.value = qval2) %>%
  dplyr::arrange(p.value) %>%
  dplyr::select(m.z, r.t, p.value, t.score)

#EE
Xcms_Maaslin_F_EE_stats <-Xcms_Maaslin_F_EE_results %>% 
  as.data.frame() %>%
  dplyr::filter(metadata == "EE_average_per_hour_residual") %>%
  dplyr::mutate(t.score = coef/stderr) %>% 
  tidyr::separate(feature, sep = "_rt", into = c("m.z", "r.t")) %>%
  dplyr::mutate(m.z = sub("mz", "", m.z)) %>%
  dplyr::mutate(qval2 = p.adjust(pval, method = "BH")) %>%
  dplyr::rename(p.value = qval2) %>%
  dplyr::arrange(p.value) %>%
  dplyr::select(m.z, r.t, p.value, t.score)

Xcms_Maaslin_M_EE_stats <-Xcms_Maaslin_M_EE_results %>% 
  as.data.frame() %>%
  dplyr::filter(metadata == "EE_average_per_hour_residual") %>%
  dplyr::mutate(t.score = coef/stderr) %>% 
  tidyr::separate(feature, sep = "_rt", into = c("m.z", "r.t")) %>%
  dplyr::mutate(m.z = sub("mz", "", m.z)) %>%
  dplyr::mutate(qval2 = p.adjust(pval, method = "BH")) %>%
  dplyr::rename(p.value = qval2) %>%
  dplyr::arrange(p.value) %>%
  dplyr::select(m.z, r.t, p.value, t.score)
write.table(Xcms_Maaslin_F_stats, file = "./data/Interim_output/Xcms_Maaslin_F_stats.txt", sep = "," ,row.names = FALSE, quote = FALSE)
write.table(Xcms_Maaslin_M_stats, file = "./data/Interim_output/Xcms_Maaslin_M_stats.txt", sep = "," ,row.names = FALSE, quote = FALSE)

write.table(Xcms_Maaslin_F_EE_stats, file = "./data/Interim_output/Xcms_Maaslin_F_EE_stats.txt", sep = "," ,row.names = FALSE, quote = FALSE)
write.table(Xcms_Maaslin_M_EE_stats, file = "./data/Interim_output/Xcms_Maaslin_M_EE_stats.txt", sep = "," ,row.names = FALSE, quote = FALSE)

MetaboAnalyst Output

MA_int_F_EE <- fread("./data/Metabolomics/metaboanalyst/MetaboAnalyst_F_EE/mummichog_integ_pathway_enrichment.csv")
MA_gsea_F_EE <- fread("./data/Metabolomics/metaboanalyst/MetaboAnalyst_F_EE/mummichog_fgsea_pathway_enrichment.csv")

#Females
MA_gsea_F_CM.2 <- MA_gsea_F_EE %>%
  dplyr::rename(Pathway = V1)%>%
  dplyr::select(Pathway, NES) 

MA_int_F_EE.2 <- MA_int_F_EE %>% 
  dplyr::rename(Pathway = V1)%>%
  dplyr::select(Pathway, Combined_Pvals) %>%
  dplyr::filter(Combined_Pvals <= 0.05) %>%
  dplyr::left_join(MA_gsea_F_CM.2, by = "Pathway") %>%
  dplyr::arrange(-NES) %>%
  dplyr::mutate(analysis = "F")%>%
  dplyr::mutate(variable = "EE")

Fig4_F_EE_pathway <- MA_int_F_EE.2 %>% 
  dplyr::arrange(NES) %>% 
  dplyr::mutate(Pathway = factor(Pathway, levels = Pathway)) %>% 
  ggplot(aes(y = NES, x = Pathway, fill = Combined_Pvals)) +
  geom_bar(stat = "identity") +
  theme_classic(base_size = 10) +
  scale_fill_gradient(high = "#fed799", low = "#b73779", na.value = NA, name = "Combined\np-value") + 
  coord_flip() +
  ggtitle("F - EE")+ 
  theme(plot.title = element_text(hjust = 0.5))+
  theme(axis.title.y=element_blank()) +
  theme(legend.position = 'right') +
   theme(
        legend.key.height = unit(0.5, 'cm'), 
        legend.key.width = unit(0.5, 'cm')) 
Fig4_F_EE_pathway 

Fig. 4 - Changes of metabolism in relation to activity and energy expenditure.

Fig4_align <- cowplot::align_plots(Fig4_totalSCFA + theme(legend.position="none"),
                                      Fig4_tscfa_distance + theme(legend.position="none"),
                                      Fig4_butyrate+ theme(legend.position="none"),
                                      Fig4_butyrate_distance + theme(legend.position="none"),
                                      Fig4_Corticosterone+ theme(legend.position="none"),
                                      align = 'v', axis = 'l')
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
Fig4_1 <- cowplot::plot_grid(Fig4_align[[1]],
                                  Fig4_align[[3]],
                                  Fig4_align[[2]],
                                Fig4_align[[4]],
                                  ncol=4, nrow=1, labels = c("A", "B", "C", "D"),label_size = 12, rel_widths = c(2, 2,1.8, 1.8))

Fig4_2 <- cowplot::plot_grid(Fig4_align[[5]],
                                  Fig4_F_EE_pathway,
                                Legend_treatment_sex, 
                                  ncol=3, nrow=1, labels = c( "E", "F", NA),label_size = 12, rel_widths = c(2, 4.2, 1.4))


Figure4 <- cowplot::plot_grid(NA, 
                                 Fig4_1, 
                             Fig4_2,
                             ncol=1, nrow = 3, rel_heights = c(0.1, 1,1))
Warning: Cannot convert object of class logical into a grob.Warning: Removed 1 rows containing missing values (geom_text).
Figure4

ggsave("./Figure4.pdf", plot = Figure4, device = cairo_pdf,  
  width = 17,
  height = 10.5,
  units = "cm")

Fig. S5 - Candidate metabolites assessed in cecal contents and serum samples.

FigS5_align <- cowplot::align_plots(FigS5_SCFAs + theme(legend.position="none"),
                                         FigS5_tscfa_beambreaks + theme(legend.position="none"),
                                         FigS5_butyrate_beambreaks+ theme(legend.position="none"),
                                         FigS5_LCMS + theme(legend.position="none"),
                                         align = 'v', axis = 'l')
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
FigS5_1 <- cowplot::plot_grid(FigS5_align[[2]], 
                                   FigS5_align[[3]], 
                                   ncol = 2, nrow=1, labels = c("B", "C"), label_size = 12, rel_widths = c(1,1))

FigS5_2 <- cowplot::plot_grid(FigS5_1,
                                Fig3_legend_treatment_sex,
                                   ncol = 1, nrow=2, rel_heights = c(1,0.5))

FigS5_3<- cowplot::plot_grid(FigS5_align[[1]], 
                                FigS5_2,
                                   ncol = 2, nrow=1, labels = c("A", NA), label_size = 12, rel_widths = c(1, 1))

FigureS5 <- cowplot::plot_grid(NA,
                                  FigS5_3, 
                                  NA,
                                  FigS5_align[[4]],
                                   ncol = 1, nrow=5, labels = c(NA, "A", NA, "D"),label_size = 12, rel_heights = c(0.1,1, 0.1, 1))
Warning: Cannot convert object of class logical into a grob.Warning: Removed 1 rows containing missing values (geom_text).Warning: Cannot convert object of class logical into a grob.
FigureS5

ggsave("./FigureS5.pdf", plot = Fig_supp.met, device = cairo_pdf,  
  width = 17.3,
  height = 18,
  units = "cm")

Regrouping mice by final C. minuta content corroborates treatment effects

Figure S6

median_Cmin_per_gCC <- median(metadata_Cmin$qPCR_Cmin_SQ_per_gCC) 

metadata_Cmin_HL <- metadata_Cmin %>% 
  dplyr::mutate(Cmin_load = ifelse(qPCR_Cmin_SQ_per_gCC > median_Cmin_per_gCC, "High", "Low")) %>%
  dplyr::mutate(Cmin_load = factor(Cmin_load, levels = c("Low", "High"))) 

FigS6_high_Low <- metadata_Cmin_HL %>%
  dplyr::mutate(Cmin_per_gCC_1e7 = qPCR_Cmin_SQ_per_gCC / 1e7) %>% 
  ggplot(aes(x = Category, y = Cmin_per_gCC_1e7, shape = Sex, color = Cmin_load)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Category), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values=color_HL, label = c("Low-CM", "High-CM"),name = "Group") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  labs(y = expression(paste("C. minuta (GE/g) x ", e^7))) +
  theme(axis.text.x = element_text(face = "italic")) +
  geom_hline(yintercept=(median_Cmin_per_gCC/ 1e7), linetype="dashed", color = "black") +
  scale_x_discrete(labels=c("Killed" = "Killed\nCM", "Live" = "Live\nCM")) 
FigS6_high_Low

set.seed(763)
Promethion_Food_HL <- metadata_Cmin_HL %>%
  dplyr::select(MouseID, Cmin_load)  %>%
  dplyr::left_join(Promethion_Food) %>% 
  tidyr::drop_na(Cmin_load, Promethion_weight_norm)
Joining, by = "MouseID"
Promethion_Food_HL$FI_kcal_day_norm <- predict(bestNormalize(Promethion_Food_HL$FI_kcal_day))

options(contrasts=c("contr.sum", "contr.poly"))
model_food_HL <- lmerTest::lmer(FI_kcal_day_norm ~ Cmin_load*Sex + Sex*Promethion_weight_norm +Promethion_Cabinet + (Cmin_load|Batch/Sex/Promethion_Cabinet), data = Promethion_Food_HL)
boundary (singular) fit: see help('isSingular')
lmerTest::step(model_food_HL, keep = "Cmin_load")
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -1.1e-02boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with max|grad| = 0.00579757 (tol = 0.002, component 1)boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
Backward reduced random-effect table:

                                                          Eliminated npar  logLik    AIC     LRT Df Pr(>Chisq)
<none>                                                                 17 -218.25 470.50                      
Cmin_load in (Cmin_load | Sex:Batch)                               1   15 -218.25 466.50 0.00000  2     1.0000
(1 | Sex:Batch)                                                    2   14 -218.25 464.50 0.00001  1     0.9971
Cmin_load in (Cmin_load | Promethion_Cabinet:(Sex:Batch))          3   12 -218.38 460.76 0.25714  2     0.8794
(1 | Promethion_Cabinet:(Sex:Batch))                               4   11 -218.38 458.76 0.00000  1     1.0000
Cmin_load in (Cmin_load | Batch)                                   5    9 -218.59 455.19 0.42441  2     0.8088
(1 | Batch)                                                        6    8 -218.63 453.26 0.07053  1     0.7906

Backward reduced fixed-effect table:
                           Eliminated Df Sum of Sq    RSS     AIC F value   Pr(>F)    
Cmin_load:Sex                       1  1    0.1436 117.57 -46.608  0.1957 0.658795    
Sex:Promethion_weight_norm          2  1    0.1146 117.69 -48.445  0.1569 0.692559    
Promethion_Cabinet                  3  1    1.3217 119.01 -48.580  1.8193 0.179277    
Cmin_load                           0  1    0.1039 119.11 -50.434  0.1423 0.706510    
Sex                                 0  1    8.7229 127.73 -38.767 11.9473 0.000698 ***
Promethion_weight_norm              0  1    3.7749 122.78 -45.365  5.1703 0.024281 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
FI_kcal_day_norm ~ Cmin_load + Sex + Promethion_weight_norm

no effect of Cmin_load

options(contrasts=c("contr.sum", "contr.poly"))
model_food_HL.2 <- lm(FI_kcal_day_norm ~ Cmin_load+Sex + Promethion_weight_norm, data = Promethion_Food_HL)
shapiro.test(residuals(model_food_HL.2))

    Shapiro-Wilk normality test

data:  residuals(model_food_HL.2)
W = 0.98146, p-value = 0.02484
anova(lm(residuals(model_food_HL.2)~fitted.values(model_food_HL.2)))
Analysis of Variance Table

Response: residuals(model_food_HL.2)
                                Df Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_food_HL.2)   1   0.00 0.00000       0      1
Residuals                      165 119.01 0.72126               
car::Anova(model_food_HL.2, test.statistic ="F", type ="II")
Anova Table (Type II tests)

Response: FI_kcal_day_norm
                        Sum Sq  Df F value   Pr(>F)    
Cmin_load                0.104   1  0.1423 0.706510    
Sex                      8.723   1 11.9473 0.000698 ***
Promethion_weight_norm   3.775   1  5.1703 0.024281 *  
Residuals              119.008 163                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
model_food_HL.eff <- lm(FI_kcal_day ~ Cmin_load+Sex + Promethion_weight_norm, data = Promethion_Food_HL)
effects::effect("Cmin_load", model_food_HL.eff, se = TRUE) %>% as.data.frame
model_food_HL_resid <- lm(FI_kcal_day_norm ~ Sex + Promethion_weight_norm, data = Promethion_Food_HL)

Promethion_Food_HL$FI_kcal_day_resid_HL <- residuals(model_food_HL_resid)/sigma(model_food_HL_resid)

FigS6_food <- Promethion_Food_HL %>% 
  dplyr::mutate(Cmin_load = factor(Cmin_load, levels= c("Low", "High"))) %>% 
  ggplot(aes(x = Cmin_load, y = FI_kcal_day_resid_HL, shape = Sex, color = Cmin_load)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Cmin_load), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_HL) +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Low" = "Low\nCM", "High" = "High\nCM")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  labs(y = "Adj. food intake") +
  theme(axis.text.x = element_text(face = "italic")) 
FigS6_food

options(contrasts=c("contr.sum", "contr.poly"))
set.seed(650)
Promethion_Food_HL <- Promethion_Food_HL %>%
  dplyr::mutate(Feed_eficiency_norm = predict(bestNormalize(Feed_eficiency)))

model_feeding_eff_HL <- lmer(Feed_eficiency_norm ~ Sex*Cmin_load + Promethion_Cabinet + (1|Batch), data = Promethion_Food_HL)
step(model_feeding_eff_HL)
Backward reduced random-effect table:

            Eliminated npar  logLik    AIC    LRT Df Pr(>Chisq)    
<none>                    7 -225.24 464.48                         
(1 | Batch)          0    6 -237.92 487.83 25.351  1  4.778e-07 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Backward reduced fixed-effect table:
Degrees of freedom method: Satterthwaite 

                   Eliminated  Sum Sq Mean Sq NumDF   DenDF F value  Pr(>F)  
Promethion_Cabinet          1 0.02893 0.02893     1 151.545  0.0402 0.84130  
Sex:Cmin_load               2 0.68520 0.68520     1 162.932  0.9586 0.32898  
Sex                         3 0.23681 0.23681     1   9.538  0.3338 0.57679  
Cmin_load                   0 2.99525 2.99525     1 163.922  4.2210 0.04151 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
Feed_eficiency_norm ~ Cmin_load + (1 | Batch)
model_feeding_eff_HL.2 <- lmer(Feed_eficiency_norm ~ Cmin_load + (1|Batch), data = Promethion_Food_HL)
shapiro.test(residuals(model_feeding_eff_HL.2))

    Shapiro-Wilk normality test

data:  residuals(model_feeding_eff_HL.2)
W = 0.99084, p-value = 0.3608
anova(lm(residuals(model_feeding_eff_HL.2)~fitted.values(model_feeding_eff_HL.2)))
Analysis of Variance Table

Response: residuals(model_feeding_eff_HL.2)
                                       Df  Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_feeding_eff_HL.2)   1   1.107 1.10725  1.6738 0.1976
Residuals                             165 109.152 0.66153               
plot(model_feeding_eff_HL.2)

Anova(model_feeding_eff_HL.2, type ="II", test.statistic ="F")
Analysis of Deviance Table (Type II Wald F tests with Kenward-Roger df)

Response: Feed_eficiency_norm
               F Df Df.res  Pr(>F)  
Cmin_load 4.1482  1 163.97 0.04329 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
model_feeding_eff_HL.eff <- lmer(Feed_eficiency ~ Cmin_load + (1|Batch), data = Promethion_Food_HL)
effects::effect("Cmin_load", model_feeding_eff_HL.eff, se = TRUE) %>% as.data.frame
model_feeding_eff_HL.resid <- lmer(Feed_eficiency_norm ~ (1|Batch), data = Promethion_Food_HL)

Promethion_Food_HL$Feed_efficency_resid_HL <- residuals(model_feeding_eff_HL.resid)/sigma(model_feeding_eff_HL.resid)

FigS6_feed_eff <- Promethion_Food_HL %>%
  dplyr::mutate(Cmin_load = factor(Cmin_load, levels= c("Low", "High"))) %>% 
  ggplot(aes(x = Cmin_load, y = Feed_efficency_resid_HL, shape = Sex, color = Cmin_load)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Cmin_load), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_HL) +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Low" = "Low\nCM", "High" = "High\nCM")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  labs(y = "Adj. feed efficiency") +
  theme(axis.text.x = element_text(face = "italic")) 
FigS6_feed_eff

set.seed(628)
metadata_bc_HL <- metadata_Cmin_HL %>%
  dplyr::select(MouseID, Cmin_load)  %>%
  dplyr::left_join(metadata_bc, by ="MouseID") %>% 
  tidyr::drop_na(Cmin_load, bombcal_Calorific_Value_kcal_total_day)
 

metadata_bc_HL <- metadata_bc_HL %>%
  dplyr::mutate(bombcal_Calorific_Value_kcal_total_day_norm = predict(bestNormalize(bombcal_Calorific_Value_kcal_total_day)),
                Promethion_weight_norm <- predict(bestNormalize(Promethion_weight)), 
                bombcal_Dry_sample_mass_norm <- predict(bestNormalize(bombcal_Dry_sample_mass)))

model_Bomb_cal_HL <- lmerTest::lmer(bombcal_Calorific_Value_kcal_total_day_norm ~ Cmin_load*Sex + Promethion_weight_norm +(Cmin_load|Batch/Sex/Promethion_Cabinet), data = metadata_bc_HL)
boundary (singular) fit: see help('isSingular')
lmerTest::step(model_Bomb_cal_HL, keep = "Cmin_load")
Warning: Model failed to converge with max|grad| = 0.00204632 (tol = 0.002, component 1)boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 2 negative eigenvalues: -2.4e-02 -1.3e-01boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -2.6e-01boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -4.9e-01Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvaluesWarning: Model failed to converge with 1 negative eigenvalue: -2.6e-01Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvaluesWarning: Model failed to converge with 1 negative eigenvalue: -2.6e-01
Backward reduced random-effect table:

                                                          Eliminated npar  logLik    AIC    LRT Df Pr(>Chisq)   
<none>                                                                 15 -110.47 250.94                        
Cmin_load in (Cmin_load | Sex:Batch)                               1   13 -110.47 246.94 0.0000  2   1.000000   
(1 | Sex:Batch)                                                    2   12 -110.47 244.94 0.0000  1   0.999903   
Cmin_load in (Cmin_load | Batch)                                   3   10 -110.56 241.12 0.1864  2   0.911007   
Cmin_load in (Cmin_load | Promethion_Cabinet:(Sex:Batch))          4    8 -110.63 237.25 0.1298  2   0.937172   
(1 | Batch)                                                        5    7 -110.63 235.25 0.0004  1   0.983430   
(1 | Promethion_Cabinet:(Sex:Batch))                               0    6 -115.33 242.66 9.4111  1   0.002157 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Backward reduced fixed-effect table:
Degrees of freedom method: Satterthwaite 

                       Eliminated Sum Sq Mean Sq NumDF  DenDF F value    Pr(>F)    
Cmin_load:Sex                   1 0.8972  0.8972     1 82.646  1.5933 0.2104077    
Sex                             2 0.2487  0.2487     1 19.272  0.4399 0.5150264    
Cmin_load                       0 2.0141  2.0141     1 83.901  3.5741 0.0621396 .  
Promethion_weight_norm          0 8.0426  8.0426     1 56.535 14.2717 0.0003825 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
bombcal_Calorific_Value_kcal_total_day_norm ~ Cmin_load + Promethion_weight_norm + (1 | Promethion_Cabinet:(Sex:Batch))
options(contrasts=c("contr.sum", "contr.poly"))

model_Bomb_cal_HL.2 <- lmer(bombcal_Calorific_Value_kcal_total_day_norm ~ Cmin_load + Promethion_weight_norm+ (1 | Promethion_Cabinet:(Sex:Batch)), data = metadata_bc_HL)
stats::shapiro.test(residuals(model_Bomb_cal_HL.2))

    Shapiro-Wilk normality test

data:  residuals(model_Bomb_cal_HL.2)
W = 0.99079, p-value = 0.7991
anova(lm(residuals(model_Bomb_cal_HL.2)~fitted.values(model_Bomb_cal_HL.2)))
Analysis of Variance Table

Response: residuals(model_Bomb_cal_HL.2)
                                   Df Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_Bomb_cal_HL.2)  1  0.529 0.52857  1.0551 0.3072
Residuals                          86 43.082 0.50096               
plot(model_Bomb_cal_HL.2)

options(contrasts=c("contr.sum", "contr.poly"))
car::Anova(model_Bomb_cal_HL.2, test.statistic="F", type = "II")
Analysis of Deviance Table (Type II Wald F tests with Kenward-Roger df)

Response: bombcal_Calorific_Value_kcal_total_day_norm
                             F Df Df.res    Pr(>F)    
Cmin_load               3.4532  1 83.871 0.0666359 .  
Promethion_weight_norm 12.9316  1 56.017 0.0006835 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
model_Bomb_cal_HL_eff <- lmer(bombcal_Calorific_Value_kcal_total_day ~ Cmin_load + Promethion_weight_norm+ (1 | Promethion_Cabinet:(Sex:Batch)), data = metadata_bc_HL)

effect(c("Cmin_load"), model_Bomb_cal_HL_eff, se =TRUE) %>% as.data.frame
model_Bomb_cal_HL_resid <- lmer(bombcal_Calorific_Value_kcal_total_day_norm ~ Sex + Promethion_weight_norm+ (1 | Promethion_Cabinet:(Sex:Batch)), data = metadata_bc_HL)

metadata_bc_HL$bombcal_Calorific_Value_kcal_total_day_resid_HL <- residuals(model_Bomb_cal_HL_resid)/sigma(model_Bomb_cal_HL_resid)

FigS6_bomb_cal <- metadata_bc_HL %>%
  drop_na(Cmin_load) %>% 
  dplyr::mutate(Cmin_load = factor(Cmin_load, levels= c("Low", "High"))) %>% 
  ggplot(aes(x = Cmin_load, y = bombcal_Calorific_Value_kcal_total_day_resid_HL, shape = Sex, color = Cmin_load)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Cmin_load), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_HL) +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Low" = "Low\nCM", "High" = "High\nCM")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  labs(y = "Adj. fecal energy content") +
  theme(axis.text.x = element_text(face = "italic")) 
FigS6_bomb_cal

Beam Breaks

set.seed(259)

Promethion_activity_HL <- metadata_Cmin_HL %>%
  dplyr::select(MouseID, Cmin_load)  %>%
  dplyr::left_join(Promethion_activity, by ="MouseID") %>% 
  tidyr::drop_na(Cmin_load, Beam_breaks)

Promethion_activity_HL$Beam_breaks_norm <- predict(bestNormalize(Promethion_activity_HL$Beam_breaks))

options(contrasts=c("contr.sum", "contr.poly"))

model_bb_HL<-(lmer(Beam_breaks_norm ~ Cmin_load*Sex + Promethion_Cabinet + (Cmin_load|Batch), Promethion_activity_HL))
step(model_bb_HL, keep ="Cmin_load")
Backward reduced random-effect table:

                                 Eliminated npar  logLik    AIC    LRT Df Pr(>Chisq)    
<none>                                         9 -221.60 461.19                         
Cmin_load in (Cmin_load | Batch)          1    7 -222.16 458.31  1.122  2     0.5707    
(1 | Batch)                               0    6 -238.09 488.17 31.855  1  1.661e-08 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Backward reduced fixed-effect table:
Degrees of freedom method: Satterthwaite 

                   Eliminated Sum Sq Mean Sq NumDF   DenDF F value  Pr(>F)  
Promethion_Cabinet          1 0.0587  0.0587     1 164.730  0.1023 0.74948  
Cmin_load:Sex               2 0.1064  0.1064     1 175.991  0.1865 0.66640  
Cmin_load                   0 2.0815  2.0815     1 176.694  3.6581 0.05741 .
Sex                         0 3.4091  3.4091     1   9.588  5.9913 0.03535 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
Beam_breaks_norm ~ Cmin_load + Sex + (1 | Batch)
options(contrasts=c("contr.sum", "contr.poly"))
model_bb_HL.2<-(lmer(Beam_breaks_norm ~ Cmin_load + (1|Batch), Promethion_activity_HL))
stats::shapiro.test(resid(model_bb_HL.2))

    Shapiro-Wilk normality test

data:  resid(model_bb_HL.2)
W = 0.9904, p-value = 0.2703
anova(lm(residuals(model_bb_HL.2)~fitted.values(model_bb_HL.2)))
Analysis of Variance Table

Response: residuals(model_bb_HL.2)
                              Df Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_bb_HL.2)   1  0.450 0.45046  0.8434 0.3597
Residuals                    178 95.074 0.53412               
plot(model_bb_HL.2)

car::Anova(model_bb_HL.2, test.statistic ="F", type ="II")
Analysis of Deviance Table (Type II Wald F tests with Kenward-Roger df)

Response: Beam_breaks_norm
               F Df Df.res  Pr(>F)  
Cmin_load 3.0085  1  175.4 0.08458 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
model_bb_HL.eff<-(lmer(Beam_breaks ~ Cmin_load + (1|Batch), Promethion_activity_HL))
effects::effect("Cmin_load", model_bb_HL.eff, se =TRUE) %>% as.data.frame()
model_bb_HL.resid<-(lmerTest::lmer(Beam_breaks_norm ~ (1 | Batch), Promethion_activity_HL))

Promethion_activity_HL$BeamBreaks_HL_resid <- residuals(model_bb_HL.resid)/sigma(model_bb_HL.resid)

FigS6_bb_HL <- Promethion_activity_HL %>%
  drop_na(Cmin_load) %>% 
  dplyr::mutate(Cmin_load = factor(Cmin_load, levels= c("Low", "High"))) %>% 
  ggplot(aes(x = Cmin_load, y = Beam_breaks_norm, shape = Sex, color = Cmin_load)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Cmin_load), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_HL) +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Low" = "Low\nCM", "High" = "High\nCM")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  labs(y = "Adj. beam breaks") +
  theme(axis.text.x = element_text(face = "italic")) 
FigS6_bb_HL

Distance traveled

set.seed(312) 
Promethion_activity_HL$Distance_traveled_norm<- predict(bestNormalize(Promethion_activity_HL$Distance_traveled))

model_distance_HL<-(lmer(Distance_traveled_norm ~ Cmin_load*Sex + Promethion_Cabinet + (Cmin_load|Batch), Promethion_activity_HL))
boundary (singular) fit: see help('isSingular')
lmerTest::step(model_distance_HL, keep = "Cmin_load")
Backward reduced random-effect table:

                                 Eliminated npar  logLik    AIC    LRT Df Pr(>Chisq)    
<none>                                         9 -222.01 462.02                         
Cmin_load in (Cmin_load | Batch)          1    7 -222.50 459.01  0.990  2     0.6096    
(1 | Batch)                               0    6 -241.49 494.97 37.964  1  7.205e-10 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Backward reduced fixed-effect table:
Degrees of freedom method: Satterthwaite 

                   Eliminated Sum Sq Mean Sq NumDF   DenDF F value  Pr(>F)  
Promethion_Cabinet          1 0.0244  0.0244     1 165.109  0.0424 0.83709  
Cmin_load:Sex               2 0.2097  0.2097     1 175.957  0.3669 0.54549  
Cmin_load                   0 0.9283  0.9283     1 176.545  1.6284 0.20360  
Sex                         0 3.4964  3.4964     1   9.849  6.1336 0.03307 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
Distance_traveled_norm ~ Cmin_load + Sex + (1 | Batch)
model_distance_HL.2<-(lmer(Distance_traveled_norm ~ Cmin_load*Sex + (1|Batch), Promethion_activity_HL))
shapiro.test(residuals(model_distance_HL.2))

    Shapiro-Wilk normality test

data:  residuals(model_distance_HL.2)
W = 0.98954, p-value = 0.2095
anova(lm(residuals(model_distance_HL.2)~fitted.values(model_distance_HL.2)))
Analysis of Variance Table

Response: residuals(model_distance_HL.2)
                                    Df Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_distance_HL.2)   1  0.339 0.33916  0.6338  0.427
Residuals                          178 95.258 0.53516               
car::Anova(model_distance_HL.2, type ="III", test.statistic ="F")
Analysis of Deviance Table (Type III Wald F tests with Kenward-Roger df)

Response: Distance_traveled_norm
                   F Df  Df.res  Pr(>F)  
(Intercept)   0.0094  1   9.812 0.92474  
Cmin_load     1.3316  1 175.957 0.25009  
Sex           6.0022  1   9.812 0.03469 *
Cmin_load:Sex 0.3593  1 175.957 0.54969  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
emmeans::joint_tests(model_distance_HL.2, by ="Sex")
Sex = F:
 model term df1    df2 F.ratio p.value
 Cmin_load    1 174.36   0.133  0.7159

Sex = M:
 model term df1    df2 F.ratio p.value
 Cmin_load    1 171.24   1.824  0.1787
model_distance_HL.eff<-(lmer(Distance_traveled ~ Cmin_load*Sex  + (1|Batch), Promethion_activity_HL))
effects::effect("Cmin_load*Sex", model_distance_HL.eff, se =TRUE) %>% as.data.frame
model_distance_HL.resid <-(lmer(Distance_traveled_norm ~ Sex + (1|Batch), Promethion_activity_HL))

Promethion_activity_HL$Distance_traveled_resid_HL <- residuals(model_distance_HL.resid)/sigma(model_distance_HL.resid)

FigS6_distance_HL <- Promethion_activity_HL %>%
  drop_na(Cmin_load) %>% 
  dplyr::mutate(Cmin_load = factor(Cmin_load, levels= c("Low", "High"))) %>% 
  ggplot(aes(x = Cmin_load, y = Distance_traveled_resid_HL, shape = Sex, color = Cmin_load)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Cmin_load), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_HL) +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Low" = "Low\nCM", "High" = "High\nCM")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  labs(y = "Adj. distance traveled") +
  theme(axis.text.x = element_text(face = "italic"))  + 
  facet_grid(.~Sex) 
FigS6_distance_HL

FigS6_HL_legend <- cowplot::get_legend(metadata_Cmin_HL %>% 
  dplyr::mutate(Sex = ifelse(Sex == "F", "Female", "Male"), Cmin_load = ifelse(Cmin_load == "Low", "Low-CM", "High-CM")) %>%
  dplyr::mutate(Sex_Cmin_load = paste(Sex, Cmin_load, sep = " ")) %>%
  ggplot() +
  geom_point(aes(x = Sex_Cmin_load, y = qPCR_Cmin_per_gCC, shape = Sex_Cmin_load, color = Sex_Cmin_load), size =3 , alpha =1,
             show.legend = T) +
  scale_shape_manual(values=c(16, 16,4, 4)) + 
  scale_color_manual(values= c(color_HL, color_HL)) +
  theme_classic(base_size = 10) +
  theme(legend.title = element_blank()))


FigS6_align <- cowplot::align_plots(FigS6_high_Low + theme(legend.position="none"),
                                            FigS6_food + theme(legend.position="none"),
                                            FigS6_feed_eff + theme(legend.position="none"),
                                            FigS6_bomb_cal + theme(legend.position="none"),
                                          FigS6_bb_HL + theme(legend.position="none"),
                                          FigS6_distance_HL + theme(legend.position="none"),
                                            align = 'v', axis = 'l')

FigS6_1 <- cowplot::plot_grid(FigS6_align[[1]],  
                               FigS6_align[[2]], 
                               FigS6_align[[3]], 
                               FigS6_align[[4]], 
                               ncol=4, nrow=1, labels = c("A", "B", "C", "D"), label_size = 12, rel_widths = c(1,1,1,1))
FigS6_2 <- cowplot::plot_grid(NA,  
                               FigS6_align[[5]], 
                               NA, 
                               FigS6_align[[6]], 
                               FigS6_HL_legend,
                               ncol=5, nrow=1, labels = c(NA, "E", NA, "F", NA), label_size = 12, rel_widths = c(0.3,1,0.3,1.8,0.8))
Warning: Cannot convert object of class logical into a grob.Warning: Cannot convert object of class logical into a grob.
FigureS6 <- cowplot::plot_grid(FigS6_1,  
                               FigS6_2, 
                               ncol=1, nrow=2, rel_heights = c(1,1))
Warning: Removed 1 rows containing missing values (geom_text).Warning: Removed 1 rows containing missing values (geom_text).Warning: Removed 1 rows containing missing values (geom_text).
FigureS6

ggsave("./FigureS6.pdf", plot = FigureS6, device = cairo_pdf,  
  width = 15.5,
  height = 10.5,
  units = "cm")

FigureS7

set.seed(759)

metadata_Cmin_HL_qPCR <- metadata_Cmin_HL %>%
  tidyr::drop_na(Cmin_load, qPCR_16S_SQ_per_gCC) %>%
  dplyr::mutate(qPCR_16S_SQ_per_gCC_norm = predict(bestNormalize(qPCR_16S_SQ_per_gCC)))

model_qPCR16S_HL<- lmerTest::lmer(qPCR_16S_SQ_per_gCC_norm ~ Cmin_load*Sex + T6_weight + Plate + (1|qPCR_Round/Batch/Sex), data = metadata_Cmin_HL_qPCR)
Warning: unable to evaluate scaled gradientWarning:  Hessian is numerically singular: parameters are not uniquely determined
lmerTest::step(model_qPCR16S_HL, keep = "Cmin_load")
Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvaluesWarning: Model failed to converge with 1 negative eigenvalue: -1.2e-08Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvaluesWarning: Model failed to converge with 1 negative eigenvalue: -1.2e-08Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvaluesWarning: Model failed to converge with 1 negative eigenvalue: -1.2e-08
Backward reduced random-effect table:

                             Eliminated npar  logLik    AIC    LRT Df Pr(>Chisq)  
<none>                                    11 -250.04 522.07                       
(1 | Sex:(Batch:qPCR_Round))          1   10 -250.04 520.07 0.0000  1     1.0000  
(1 | qPCR_Round)                      2    9 -250.04 518.07 0.0000  1     1.0000  
(1 | Batch:qPCR_Round)                0    8 -251.80 519.60 3.5235  1     0.0605 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Backward reduced fixed-effect table:
Degrees of freedom method: Satterthwaite 

              Eliminated  Sum Sq Mean Sq NumDF   DenDF F value    Pr(>F)    
T6_weight              1  0.2349  0.2349     1 170.596  0.2863 0.5932750    
Cmin_load:Sex          2  0.4815  0.4815     1 147.792  0.5894 0.4438806    
Sex                    3  1.0246  1.0246     1   9.734  1.2591 0.2887426    
Plate                  4  4.7372  2.3686     2  23.095  2.9116 0.0745347 .  
Cmin_load              0 10.6378 10.6378     1 168.331 12.9777 0.0004147 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
qPCR_16S_SQ_per_gCC_norm ~ Cmin_load + (1 | Batch:qPCR_Round)
model_qPCR16S_HL.2<- lmer(qPCR_16S_SQ_per_gCC_norm ~ Cmin_load + Plate + (1 | Batch:qPCR_Round), data = metadata_Cmin_HL_qPCR)

shapiro.test(residuals(model_qPCR16S_HL.2))

    Shapiro-Wilk normality test

data:  residuals(model_qPCR16S_HL.2)
W = 0.9793, p-value = 0.008588
anova(lm(residuals(model_qPCR16S_HL.2) ~ fitted(model_qPCR16S_HL.2))) 
Analysis of Variance Table

Response: residuals(model_qPCR16S_HL.2)
                            Df  Sum Sq Mean Sq F value Pr(>F)
fitted(model_qPCR16S_HL.2)   1   0.689 0.68946  0.8901 0.3467
Residuals                  179 138.652 0.77459               
plot(model_qPCR16S_HL.2)

car::Anova(model_qPCR16S_HL.2, type = "II", test.statistic ="F")
Analysis of Deviance Table (Type II Wald F tests with Kenward-Roger df)

Response: qPCR_16S_SQ_per_gCC_norm
               F Df Df.res   Pr(>F)   
Cmin_load 8.4553  1 174.88 0.004112 **
Plate     2.8213  2  27.54 0.076799 . 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
model_qPCR16S_HL.eff<- lmer(qPCR_16S_SQ_per_gCC~ Cmin_load + Plate + (1 | Batch:qPCR_Round), data = metadata_Cmin_HL_qPCR)
Warning: Model may not have converged with 1 eigenvalue close to zero: 1.8e-17
effects::effect("Cmin_load", model_qPCR16S_HL.eff, se =TRUE) %>% as.data.frame
FigS7_mbiomass_HL <- metadata_Cmin_HL_qPCR %>%
  drop_na(Cmin_load) %>% 
  dplyr::mutate(Cmin_load = factor(Cmin_load, levels= c("Low", "High"))) %>% 
  dplyr::mutate(qPCR_16S_SQ_per_gCC_e10 = qPCR_16S_SQ_per_gCC/1e10) %>% 
  ggplot(aes(x = Cmin_load, y = qPCR_16S_SQ_per_gCC_e10, shape = Sex, color = Cmin_load)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Cmin_load), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_HL, label = c("Low-CM", "High-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Low" = "Low\nCM", "High" = "High\nCM")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  labs(y = expression(paste("Microbes (GE/g) x ", e^10))) +
  theme(axis.text.x = element_text(face = "italic")) 
FigS7_mbiomass_HL

bombcal ~ microbial biomass/cmin

options(contrasts=c("contr.sum", "contr.poly"))
set.seed(259)
metadata_Cmin_HL_qPCR_bc <- metadata_Cmin_HL_qPCR %>%
  dplyr::select(MouseID, qPCR_16S_SQ_per_gCC, qPCR_Cmin_SQ_per_gCC, qPCR_Round) %>%
  dplyr::left_join(metadata_bc_HL, by ="MouseID") %>%
  tidyr::drop_na(bombcal_Calorific_Value_kcal_total_day) %>%
  dplyr::mutate(qPCR_16S_SQ_per_gCC_norm = predict(bestNormalize(qPCR_16S_SQ_per_gCC)), 
                qPCR_Cmin_SQ_per_gCC_norm = predict(bestNormalize(qPCR_Cmin_SQ_per_gCC)), 
                bombcal_Calorific_Value_kcal_total_day_norm = predict(bestNormalize(bombcal_Calorific_Value_kcal_total_day)), 
                Promethion_weight_norm = predict(bestNormalize(Promethion_weight)))

model_bombcal_Cmin <- lmerTest::lmer(bombcal_Calorific_Value_kcal_total_day_norm ~ qPCR_Cmin_SQ_per_gCC_norm*Sex + qPCR_Round + Promethion_weight_norm +(1|Batch/Sex/Promethion_Cabinet), data = metadata_Cmin_HL_qPCR_bc)
boundary (singular) fit: see help('isSingular')
lmerTest::step(model_bombcal_Cmin)
Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvaluesWarning: Model failed to converge with 1 negative eigenvalue: -1.4e-03boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
Backward reduced random-effect table:

                                     Eliminated npar  logLik    AIC    LRT Df Pr(>Chisq)  
<none>                                            10 -111.21 242.41                       
(1 | Sex:Batch)                               1    9 -111.21 240.41 0.0000  1    1.00000  
(1 | Batch)                                   2    8 -111.21 238.41 0.0000  1    1.00000  
(1 | Promethion_Cabinet:(Sex:Batch))          0    7 -114.14 242.27 5.8594  1    0.01549 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Backward reduced fixed-effect table:
Degrees of freedom method: Satterthwaite 

                              Eliminated  Sum Sq Mean Sq NumDF  DenDF F value    Pr(>F)    
qPCR_Cmin_SQ_per_gCC_norm:Sex          1  0.0497  0.0497     1 79.932  0.0826 0.7745795    
Sex                                    2  0.7347  0.7347     1 22.271  1.2380 0.2777203    
qPCR_Round                             3  0.7736  0.7736     1 79.658  1.3059 0.2565668    
qPCR_Cmin_SQ_per_gCC_norm              4  0.9449  0.9449     1 83.458  1.5865 0.2113406    
Promethion_weight_norm                 0 10.6658 10.6658     1 45.900 17.5674 0.0001249 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
bombcal_Calorific_Value_kcal_total_day_norm ~ Promethion_weight_norm + (1 | Promethion_Cabinet:(Sex:Batch))
model_bombcal_biomass <- lmerTest::lmer(bombcal_Calorific_Value_kcal_total_day_norm ~ qPCR_16S_SQ_per_gCC_norm*Sex + qPCR_Round + Promethion_weight_norm +(1|Batch/Sex/Promethion_Cabinet), data = metadata_Cmin_HL_qPCR_bc)
boundary (singular) fit: see help('isSingular')
lmerTest::step(model_bombcal_biomass)
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
boundary (singular) fit: see help('isSingular')
Backward reduced random-effect table:

                                     Eliminated npar  logLik    AIC   LRT Df Pr(>Chisq)  
<none>                                            10 -111.78 243.57                      
(1 | Sex:Batch)                               1    9 -111.78 241.57 0.000  1    1.00000  
(1 | Batch)                                   2    8 -111.78 239.57 0.000  1    1.00000  
(1 | Promethion_Cabinet:(Sex:Batch))          0    7 -114.52 243.04 5.471  1    0.01933 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Backward reduced fixed-effect table:
Degrees of freedom method: Satterthwaite 

                             Eliminated  Sum Sq Mean Sq NumDF  DenDF F value    Pr(>F)    
qPCR_16S_SQ_per_gCC_norm:Sex          1  0.2379  0.2379     1 76.549  0.3863 0.5360894    
qPCR_16S_SQ_per_gCC_norm              2  0.0188  0.0188     1 77.540  0.0308 0.8612200    
Sex                                   3  0.8487  0.8487     1 24.232  1.4087 0.2467763    
qPCR_Round                            4  0.8994  0.8994     1 81.231  1.4937 0.2251849    
Promethion_weight_norm                0 10.6658 10.6658     1 45.900 17.5674 0.0001249 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model found:
bombcal_Calorific_Value_kcal_total_day_norm ~ Promethion_weight_norm + (1 | Promethion_Cabinet:(Sex:Batch))
model_bombcal_Cmin.2 <- lmerTest::lmer(bombcal_Calorific_Value_kcal_total_day_norm ~ qPCR_Cmin_SQ_per_gCC_norm + Promethion_weight_norm + (1 | Promethion_Cabinet:(Sex:Batch)), data = metadata_Cmin_HL_qPCR_bc)
model_bombcal_biomass.2 <- lmerTest::lmer(bombcal_Calorific_Value_kcal_total_day_norm ~ qPCR_16S_SQ_per_gCC_norm + Promethion_weight_norm + (1 | Promethion_Cabinet:(Sex:Batch)), data = metadata_Cmin_HL_qPCR_bc)

shapiro.test(residuals(model_bombcal_Cmin.2))

    Shapiro-Wilk normality test

data:  residuals(model_bombcal_Cmin.2)
W = 0.99156, p-value = 0.8481
shapiro.test(residuals(model_bombcal_biomass.2))

    Shapiro-Wilk normality test

data:  residuals(model_bombcal_biomass.2)
W = 0.99057, p-value = 0.7836
anova(lm(residuals(model_bombcal_Cmin.2)~fitted.values(model_bombcal_Cmin.2)))
Analysis of Variance Table

Response: residuals(model_bombcal_Cmin.2)
                                    Df Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_bombcal_Cmin.2)  1  0.575 0.57455  1.0795 0.3017
Residuals                           86 45.772 0.53223               
anova(lm(residuals(model_bombcal_biomass.2)~fitted.values(model_bombcal_biomass.2)))
Analysis of Variance Table

Response: residuals(model_bombcal_biomass.2)
                                       Df Sum Sq Mean Sq F value Pr(>F)
fitted.values(model_bombcal_biomass.2)  1  0.574 0.57358  1.0376 0.3112
Residuals                              86 47.539 0.55278               
car::Anova(model_bombcal_Cmin.2, test.statistic ="F", type ="II")
Analysis of Deviance Table (Type II Wald F tests with Kenward-Roger df)

Response: bombcal_Calorific_Value_kcal_total_day_norm
                                F Df Df.res    Pr(>F)    
qPCR_Cmin_SQ_per_gCC_norm  1.5364  1 83.437 0.2186307    
Promethion_weight_norm    14.2885  1 49.656 0.0004214 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
car::Anova(model_bombcal_biomass.2, test.statistic ="F", type ="II")
Analysis of Deviance Table (Type II Wald F tests with Kenward-Roger df)

Response: bombcal_Calorific_Value_kcal_total_day_norm
                              F Df Df.res    Pr(>F)    
qPCR_16S_SQ_per_gCC_norm  0.012  1 78.927 0.9131847    
Promethion_weight_norm   15.259  1 49.522 0.0002844 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
r2_model_bombcal_Cmin_mar<- partR2(model_bombcal_Cmin.2, partvars = c("qPCR_Cmin_SQ_per_gCC_norm"), 
                  R2_type = "marginal", nboot = 10)

  |                                                  | 0 % ~calculating  
  |+++++                                             | 10% ~01s          
  |++++++++++                                        | 20% ~01s          
  |+++++++++++++++                                   | 30% ~01s          
  |++++++++++++++++++++                              | 40% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++++++                    | 60% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
r2_model_bombcal_Cmin_mar$R2 %>% dplyr::filter(term == "qPCR_Cmin_SQ_per_gCC_norm") %>% dplyr::select(estimate) %>% pull()
[1] 0.01108785
r2_model_bombcal_biomass_mar<- partR2(model_bombcal_biomass.2, partvars = c("qPCR_16S_SQ_per_gCC_norm"), 
                  R2_type = "marginal", nboot = 10)

  |                                                  | 0 % ~calculating  
  |+++++                                             | 10% ~01s          
  |++++++++++                                        | 20% ~01s          
  |+++++++++++++++                                   | 30% ~01s          
  |++++++++++++++++++++                              | 40% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++++++                    | 60% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
r2_model_bombcal_biomass_mar$R2 %>% dplyr::filter(term == "qPCR_16S_SQ_per_gCC_norm") %>% dplyr::select(estimate) %>% pull()
[1] 7.367549e-05
model_bombcal_HL_resid <- lmer(bombcal_Calorific_Value_kcal_total_day_norm ~ Sex + Promethion_weight_norm+ (1 | Promethion_Cabinet:(Sex:Batch)), data = metadata_Cmin_HL_qPCR_bc)
metadata_Cmin_HL_qPCR_bc$bombcal_Calorific_Value_kcal_total_day_resid <- residuals(model_bombcal_HL_resid)/sigma(model_bombcal_HL_resid)

FigS7_biomass_bc<- metadata_Cmin_HL_qPCR_bc %>%
  ggplot(aes(x= qPCR_16S_SQ_per_gCC_norm ,y=bombcal_Calorific_Value_kcal_total_day_resid)) +
  geom_smooth(method = "lm", se = F,  alpha = 0.8, size = 0.5, color ="black")+ 
  geom_point(aes(color = Cmin_load, shape = Sex), alpha =0.7, size =0.75, show.legend = T) +
  scale_shape_manual(values=shape_Sex, label = c("Female", "Male"),name = "Sex") + 
  scale_color_manual(values=color_HL, label = c(expression(italic("Low-CM")), expression(italic("High-CM"))), name = "Group") +
  theme_classic(base_size = 10) +
  labs(x = "Norm. microbes", y = "Adj. fecal energy\ncontent") 
FigS7_biomass_bc


FigS7_cmin_bc<- metadata_Cmin_HL_qPCR_bc %>%
  ggplot(aes(x= qPCR_Cmin_SQ_per_gCC_norm ,y=bombcal_Calorific_Value_kcal_total_day_resid)) +
  geom_smooth(method = "lm", se = F,  alpha = 0.8, size = 0.5, color ="black")+ 
  geom_point(aes(color = Cmin_load, shape = Sex), alpha =0.7, size =0.75, show.legend = T) +
  scale_shape_manual(values=shape_Sex, label = c("Female", "Male"),name = "Sex") + 
  scale_color_manual(values=color_HL, label = c(expression(italic("Low-CM")), expression(italic("High-CM"))), name = "Group") +
  theme_classic(base_size = 10) +
  labs(x = "Norm. C. minuta", y = "Adj. fecal energy\ncontent")
FigS7_cmin_bc

alpha hL

Alpha_div_HL <- metadata_Cmin_HL %>%
  dplyr::select(MouseID, Cmin_load)  %>%
  dplyr::left_join(Alpha_div, by ="MouseID") %>% 
  tidyr::drop_na(Cmin_load, shannon_entropy)

Alpha_div_HL_M <- Alpha_div_HL %>% 
  filter(Sex =="M")
Alpha_div_HL_F <- Alpha_div_HL %>% 
  filter(Sex =="F")

wilcox.test(shannon_entropy~Cmin_load, data = Alpha_div_HL_M, exact = FALSE, correct = FALSE, conf.int = FALSE)

    Wilcoxon rank sum test

data:  shannon_entropy by Cmin_load
W = 1072, p-value = 0.501
alternative hypothesis: true location shift is not equal to 0
wilcox.test(shannon_entropy~Cmin_load, data = Alpha_div_HL_F, exact = FALSE, correct = FALSE, conf.int = FALSE)

    Wilcoxon rank sum test

data:  shannon_entropy by Cmin_load
W = 1036, p-value = 0.8636
alternative hypothesis: true location shift is not equal to 0
wilcox.test(pielou_evenness~Cmin_load, data = Alpha_div_HL_M, exact = FALSE, correct = FALSE, conf.int = FALSE)

    Wilcoxon rank sum test

data:  pielou_evenness by Cmin_load
W = 898, p-value = 0.4503
alternative hypothesis: true location shift is not equal to 0
wilcox.test(pielou_evenness~Cmin_load, data = Alpha_div_HL_F, exact = FALSE, correct = FALSE, conf.int = FALSE)

    Wilcoxon rank sum test

data:  pielou_evenness by Cmin_load
W = 820, p-value = 0.06309
alternative hypothesis: true location shift is not equal to 0
wilcox.test(faith_pd~Cmin_load, data = Alpha_div_HL_M, exact = FALSE, correct = FALSE, conf.int = FALSE)

    Wilcoxon rank sum test

data:  faith_pd by Cmin_load
W = 1322, p-value = 0.006441
alternative hypothesis: true location shift is not equal to 0
wilcox.test(faith_pd~Cmin_load, data = Alpha_div_HL_F, exact = FALSE, correct = FALSE, conf.int = FALSE)

    Wilcoxon rank sum test

data:  faith_pd by Cmin_load
W = 1424, p-value = 0.004262
alternative hypothesis: true location shift is not equal to 0
wilcox.test(observed_features~Cmin_load, data = Alpha_div_HL_M, exact = FALSE, correct = FALSE, conf.int = FALSE)

    Wilcoxon rank sum test

data:  observed_features by Cmin_load
W = 1330, p-value = 0.005269
alternative hypothesis: true location shift is not equal to 0
wilcox.test(observed_features~Cmin_load, data = Alpha_div_HL_F, exact = FALSE, correct = FALSE, conf.int = FALSE)

    Wilcoxon rank sum test

data:  observed_features by Cmin_load
W = 1393, p-value = 0.008895
alternative hypothesis: true location shift is not equal to 0

–> sex-dimorphic effects gone! –> analyses by group not separated by sex anymore!

wilcox.test(shannon_entropy~Cmin_load, data = Alpha_div_HL, exact = FALSE, correct = FALSE, conf.int = FALSE)

    Wilcoxon rank sum test

data:  shannon_entropy by Cmin_load
W = 4309, p-value = 0.5437
alternative hypothesis: true location shift is not equal to 0
wilcox.test(pielou_evenness~Cmin_load, data = Alpha_div_HL, exact = FALSE, correct = FALSE, conf.int = FALSE)

    Wilcoxon rank sum test

data:  pielou_evenness by Cmin_load
W = 3531, p-value = 0.1095
alternative hypothesis: true location shift is not equal to 0
wilcox.test(faith_pd~Cmin_load, data = Alpha_div_HL, exact = FALSE, correct = FALSE, conf.int = FALSE)

    Wilcoxon rank sum test

data:  faith_pd by Cmin_load
W = 5457, p-value = 0.0001113
alternative hypothesis: true location shift is not equal to 0
wilcox.test(observed_features~Cmin_load, data = Alpha_div_HL, exact = FALSE, correct = FALSE, conf.int = FALSE)

    Wilcoxon rank sum test

data:  observed_features by Cmin_load
W = 5433.5, p-value = 0.000146
alternative hypothesis: true location shift is not equal to 0
mean_se_HL <- Alpha_div_HL %>%
  dplyr::group_by(Cmin_load) %>%
  dplyr::summarise(mean = mean(shannon_entropy), se = standard_error(shannon_entropy))%>%
  dplyr::mutate(alpha = "se")

mean_pe_HL <- Alpha_div_HL %>%
  dplyr::group_by(Cmin_load) %>%
  dplyr::summarise(mean = mean(pielou_evenness), se = standard_error(pielou_evenness))%>%
  dplyr::mutate(alpha = "pe")

mean_fdp_HL <- Alpha_div_HL %>%
  dplyr::group_by(Cmin_load) %>%
  dplyr::summarise(mean = mean(faith_pd), se = standard_error(faith_pd))%>%
  dplyr::mutate(alpha = "fdp")

mean_of_HL <- Alpha_div_HL %>%
  dplyr::group_by(Cmin_load) %>%
  dplyr::summarise(mean = mean(observed_features), se = standard_error(observed_features))%>%
  dplyr::mutate(alpha = "of")

rbind(mean_se_HL, mean_pe_HL, mean_fdp_HL, mean_of_HL)
FigS7_alpha_HL_MR <- Alpha_div_HL %>% 
  drop_na(Cmin_load) %>% 
  dplyr::mutate(Cmin_load = factor(Cmin_load, levels= c("Low", "High"))) %>% 
  ggplot(aes(x = Cmin_load, y = observed_features, shape = Sex, color = Cmin_load)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Cmin_load), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_HL, label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Low" = "Low\nCM", "High" = "High\nCM")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  labs(y = "# microbial species") +
  theme(axis.text.x = element_text(face = "italic")) 
FigS7_alpha_HL_MR


FigS7_alpha_HL_SE <- Alpha_div_HL %>% 
  drop_na(Cmin_load) %>% 
  dplyr::mutate(Cmin_load = factor(Cmin_load, levels= c("Low", "High"))) %>% 
  ggplot(aes(x = Cmin_load, y = shannon_entropy, shape = Sex, color = Cmin_load)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Cmin_load), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_HL, label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Low" = "Low\nCM", "High" = "High\nCM")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  labs(y = "Shannon Entropy")+
  theme(axis.text.x = element_text(face = "italic")) 
FigS7_alpha_HL_SE


FigS7_alpha_HL_FPD <- Alpha_div_HL %>% 
  drop_na(Cmin_load) %>% 
  dplyr::mutate(Cmin_load = factor(Cmin_load, levels= c("Low", "High"))) %>% 
  ggplot(aes(x = Cmin_load, y = faith_pd, shape = Sex, color = Cmin_load)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Cmin_load), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_HL, label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Low" = "Low\nCM", "High" = "High\nCM")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  labs(y = "Faith's PD")+
  theme(axis.text.x = element_text(face = "italic")) 
FigS7_alpha_HL_FPD


FigS7_alpha_HL_PE <- Alpha_div_HL %>% 
  drop_na(Cmin_load) %>% 
  dplyr::mutate(Cmin_load = factor(Cmin_load, levels= c("Low", "High"))) %>% 
  ggplot(aes(x = Cmin_load, y = pielou_evenness, shape = Sex, color = Cmin_load)) + 
  geom_quasirandom(alpha = 0.7, size = 0.75) +
  stat_summary(fun = mean, geom = "point", size=2, aes(group = Cmin_load), color = "black", alpha = 0.6, shape = 15) +
  scale_color_manual(values = color_HL, label = c("Killed-CM", "Live-CM"), name = "Treatment") +
  scale_shape_manual(values = shape_Sex, label = c("Female", "Male")) +
  scale_x_discrete(labels=c("Low" = "Low\nCM", "High" = "High\nCM")) +
  theme_classic(base_size = 10) +
  theme(axis.title.x=element_blank(), plot.title = element_text(hjust = 0.5)) +
  labs(y = "Pilou evenness")+
  theme(axis.text.x = element_text(face = "italic")) 
FigS7_alpha_HL_PE

beta diversity

reads_rare_norm_metadata <- reads_rare_norm_metadata[ order(row.names(reads_rare_norm_metadata)), ] 

metadata_Cmin_load <- metadata_Cmin_HL %>%
  dplyr::select(MouseID, Cmin_load)

reads_rare_norm_metadata.melt_HL <- reads_rare_norm_metadata %>% 
  tibble::rownames_to_column(var = "sampleid")  %>%
  dplyr::left_join(metadata_Cmin_load, by ="MouseID") %>%
  dplyr::select(sampleid, Sex, Cmin_load) %>%
  dplyr::mutate_if(is.factor,as.character)

wUF_melt_HL <- melt(as.matrix(Beta_wUF.2)) %>%
    filter(as.character(Var1) != as.character(Var2)) %>%
    mutate_if(is.factor,as.character)

uwUF_melt_HL <- melt(as.matrix(Beta_uwUF.2)) %>%
    filter(as.character(Var1) != as.character(Var2)) %>%
    mutate_if(is.factor,as.character)

colnames(reads_rare_norm_metadata.melt_HL) = c("Var1", "Sex1", "Cmin_load1")
wUF_melt_HL = left_join(wUF_melt_HL, reads_rare_norm_metadata.melt_HL, by = "Var1")
uwUF_melt_HL = left_join(uwUF_melt_HL, reads_rare_norm_metadata.melt_HL, by = "Var1")

colnames(reads_rare_norm_metadata.melt_HL) = c("Var2", "Sex2", "Cmin_load2")
wUF_melt_HL = left_join(wUF_melt_HL, reads_rare_norm_metadata.melt_HL, by = "Var2")
uwUF_melt_HL = left_join(uwUF_melt_HL, reads_rare_norm_metadata.melt_HL, by = "Var2")
set.seed(765)

wUF_melt.HL <- wUF_melt_HL %>%
  dplyr::filter(Cmin_load1 == Cmin_load2, Sex1 == Sex2) %>%
  dplyr::mutate(Cmin_load = Cmin_load1, Sex = Sex1)

wilcox.test(value ~ Cmin_load, data = wUF_melt.HL, exact = FALSE, correct = FALSE)

    Wilcoxon rank sum test

data:  value by Cmin_load
W = 6273800, p-value < 2.2e-16
alternative hypothesis: true location shift is not equal to 0
uwUF_melt.HL <- uwUF_melt_HL %>%
  dplyr::filter(Cmin_load1 == Cmin_load2, Sex1 == Sex2) %>%
  dplyr::mutate(Cmin_load = Cmin_load1, Sex = Sex1) 

wilcox.test(value ~ Cmin_load, data = uwUF_melt.HL, exact = FALSE, correct = FALSE) 

    Wilcoxon rank sum test

data:  value by Cmin_load
W = 6352464, p-value < 2.2e-16
alternative hypothesis: true location shift is not equal to 0
FigS7_wUF <- wUF_melt.HL %>%
  drop_na(Cmin_load) %>%
  dplyr::mutate(Cmin_load = factor(Cmin_load, levels= c("Low", "High"))) %>% 
  ggplot(aes(x = Cmin_load, y = value, fill=factor(Cmin_load))) +
  theme_classic(base_size = 10) +
  geom_boxplot(alpha =0.7, outlier.size = 0.3, outlier.alpha = 0.5) +
  scale_fill_manual(values=color_HL)+
  scale_x_discrete(labels=c("Low" = "Low\nCM", "High" = "High\nCM")) +
  labs(y = "weighted\nUniFrac distances")  +
  theme(axis.text.x = element_text(face = "italic"), axis.title.x=element_blank()) 
FigS7_wUF


FigS7_uwUF <-uwUF_melt.HL %>%
  drop_na(Cmin_load) %>%
  dplyr::mutate(Cmin_load = factor(Cmin_load, levels= c("Low", "High"))) %>% 
  ggplot(aes(x = Cmin_load, y = value, fill=factor(Cmin_load))) +
  theme_classic(base_size = 10) +
  geom_boxplot(alpha =0.7, outlier.size = 0.3, outlier.alpha = 0.5) +
  scale_fill_manual(values=color_HL)+
  scale_x_discrete(labels=c("Low" = "Low\nCM", "High" = "High\nCM")) +
  labs(y = "unweighted\nUniFrac distances")  +
  theme(axis.text.x = element_text(face = "italic"), axis.title.x=element_blank())
FigS7_uwUF

FigS7_HL_legend <- cowplot::get_legend(metadata_Cmin_HL %>% 
  dplyr::mutate(Sex = ifelse(Sex == "F", "Female", "Male"), Cmin_load = ifelse(Cmin_load == "Low", "Low-CM", "High-CM")) %>%
  dplyr::mutate(Sex_Cmin_load = paste(Sex, Cmin_load, sep = " ")) %>%
  ggplot() +
  geom_point(aes(x = Sex_Cmin_load, y = qPCR_Cmin_per_gCC, shape = Sex_Cmin_load, color = Sex_Cmin_load), size =3 , alpha =1,
             show.legend = T) +
  scale_shape_manual(values=c(16, 16,4, 4)) + 
  scale_color_manual(values= c(color_HL, color_HL)) +
  theme_classic(base_size = 10) +
  theme(legend.title = element_blank()) + 
  theme(legend.position = "bottom"))

FigS7_align <- cowplot::align_plots(FigS7_mbiomass_HL + theme(legend.position="none"),
                                            FigS7_biomass_bc + theme(legend.position="none"),
                                            FigS7_cmin_bc + theme(legend.position="none"),
                                            FigS7_alpha_HL_MR + theme(legend.position="none"),
                                            FigS7_alpha_HL_SE + theme(legend.position="none"),
                                            FigS7_alpha_HL_FPD + theme(legend.position="none"),
                                            FigS7_alpha_HL_PE + theme(legend.position="none"),
                                            FigS7_wUF + theme(legend.position="none"),
                                            FigS7_uwUF + theme(legend.position="none"),
                                            align = 'hv', axis = 'tblr')
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
FigS7_1 <- cowplot::plot_grid(FigS7_align[[1]],
                                       FigS7_align[[2]], 
                                       FigS7_align[[3]], 
                                       FigS7_align[[4]],
                                       FigS7_align[[6]],
                                       FigS7_align[[5]],
                                       FigS7_align[[7]],
                                       FigS7_align[[8]],
                                       FigS7_align[[9]],
                                       ncol=3, nrow=3, labels = c("A", "B", "C", "D", "E", "F", "G", "H", "I"), label_size = 12, rel_widths = c(1,1, 1))

FigureS7 <- cowplot::plot_grid(FigS7_1,
                                       FigS7_HL_legend,
                                       ncol=1, nrow=2,  rel_heights = c(3, 0.05))
FigureS7

ggsave("./FigureS7.pdf", plot = FigureS7, device = cairo_pdf,  
  width = 16.5,
  height = 14,
  units = "cm")
sessionInfo()
R version 4.0.2 (2020-06-22)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 20.04.6 LTS

Matrix products: default
BLAS:   /opt/R/4.0.2/lib/R/lib/libRblas.so
LAPACK: /opt/R/4.0.2/lib/R/lib/libRlapack.so

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8     LC_MONETARY=en_US.UTF-8   
 [6] LC_MESSAGES=en_US.UTF-8    LC_PAPER=en_US.UTF-8       LC_NAME=C                  LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] ggbeeswarm_0.6.0           ggh4x_0.2.2                cowplot_1.1.1              rsq_2.5                    partR2_0.9.1.9000         
 [6] mapdata_2.3.1              maps_3.4.1                 ggmap_3.0.1                patchwork_1.1.2            vegan_2.5-7               
[11] permute_0.9-7              effects_4.2-1              Maaslin2_1.7.3             emmeans_1.7.2              reshape2_1.4.4            
[16] lmerTest_3.1-3             lme4_1.1-28                Matrix_1.2-18              PerformanceAnalytics_2.0.4 xts_0.12.1                
[21] zoo_1.8-9                  bestNormalize_1.8.2        Rmisc_1.5                  plyr_1.8.6                 lattice_0.20-41           
[26] car_3.0-12                 carData_3.0-5              lubridate_1.8.0            ggpubr_0.4.0               ggforce_0.3.3             
[31] scales_1.2.1               ggthemes_4.2.4             forcats_0.5.1              stringr_1.4.0              dplyr_1.0.8               
[36] purrr_0.3.4                readr_2.1.2                tidyr_1.2.0                tibble_3.1.6               ggplot2_3.3.5             
[41] tidyverse_1.3.1            data.table_1.14.2          switchr_0.14.5            

loaded via a namespace (and not attached):
  [1] readxl_1.3.1        backports_1.4.1     sp_1.4-6            splines_4.0.2       listenv_0.8.0       usethis_2.1.5      
  [7] lpsymphony_1.18.0   digest_0.6.29       butcher_0.1.5       foreach_1.5.2       fansi_1.0.2         magrittr_2.0.2     
 [13] cluster_2.1.0       doParallel_1.0.17   tzdb_0.2.0          remotes_2.4.2       recipes_0.2.0       globals_0.14.0     
 [19] modelr_0.1.8        gower_1.0.0         hardhat_0.2.0       jpeg_0.1-10         colorspace_2.0-3    rvest_1.0.2        
 [25] mitools_2.4         haven_2.4.3         xfun_0.29           crayon_1.5.0        RCurl_1.98-1.7      jsonlite_1.8.0     
 [31] biglm_0.9-2.1       survival_3.1-12     iterators_1.0.14    glue_1.6.1          polyclip_1.10-0     gtable_0.3.0       
 [37] ipred_0.9-12        future.apply_1.8.1  DEoptimR_1.0-10     abind_1.4-5         mvtnorm_1.1-3       DBI_1.1.2          
 [43] rngtools_1.5.2      rstatix_0.7.0       Rcpp_1.0.8          xtable_1.8-4        lava_1.6.10         survey_4.1-1       
 [49] prodlim_2019.11.13  getopt_1.20.3       httr_1.4.2          ellipsis_0.3.2      pkgconfig_2.0.3     farver_2.1.0       
 [55] nnet_7.3-14         dbplyr_2.1.1        utf8_1.2.2          RJSONIO_1.3-1.6     labeling_0.4.2      tidyselect_1.1.2   
 [61] rlang_1.0.1         munsell_0.5.0       cellranger_1.1.0    tools_4.0.2         cli_3.2.0           generics_0.1.2     
 [67] broom_0.7.12        knitr_1.37          fs_1.5.2            robustbase_0.93-9   RgoogleMaps_1.4.5.3 pbapply_1.5-0      
 [73] future_1.24.0       nlme_3.1-148        doRNG_1.8.2         xml2_1.3.3          pbkrtest_0.5.1      compiler_4.0.2     
 [79] rstudioapi_0.13     beeswarm_0.4.0      png_0.1-7           ggsignif_0.6.3      reprex_2.0.1        tweenr_1.0.2       
 [85] pcaPP_1.9-74        stringi_1.7.6       nloptr_1.2.2.3      vctrs_0.3.8         pillar_1.7.0        lifecycle_1.0.1    
 [91] optparse_1.7.1      estimability_1.3    bitops_1.0-7        insight_0.17.1      R6_2.5.1            vipor_0.4.5        
 [97] parallelly_1.30.0   codetools_0.2-16    boot_1.3-25         MASS_7.3-51.6       assertthat_0.2.1    nortest_1.0-4      
[103] withr_2.5.0         Deriv_4.1.3         mgcv_1.8-31         parallel_4.0.2      hms_1.1.1           quadprog_1.5-8     
[109] grid_4.0.2          rpart_4.1-15        timeDate_3043.102   coda_0.19-4         class_7.3-17        minqa_1.2.4        
[115] numDeriv_2016.8-1.1
LS0tCnRpdGxlOiAiU2Nob2VuIGV0IGFsLiAyMDIzIC0gQ29kZSBBbmFseXNpcyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQojIEdlbmVyYWwKCkluIHRoaXMgbm90ZWJvb2sgdGhlIGNvZGUgZm9yIHRoZSBwdWJsaWNhdGlvbiAiU2Nob2VuIGV0IGFsLiAyMDIzLCBDaHJpc3RlbnNlbmVsbGEgbWludXRhIGJvb3N0cyBndXQgbWljcm9iaWFsIGJpb21hc3MgYW5kIHZvbHVudGFyeSBwaHlzaWNhbCBhY3Rpdml0eSBpbiBtaWNlIiBmb3IgYWxsIGFuYWx5c2VzIGlzIHByb3ZpZGVkLiAKCgojIFBhY2thZ2VzCmBgYHtyfQppZiAoIXJlcXVpcmUoImRhdGEudGFibGUiKSkgaW5zdGFsbF9wYWNrYWdlcygiZGF0YS50YWJsZSIpCmxpYnJhcnkoZGF0YS50YWJsZSkKaWYgKCFyZXF1aXJlKCJ0aWR5dmVyc2UiKSkgaW5zdGFsbF9wYWNrYWdlcygidGlkeXZlcnNlIikKbGlicmFyeSh0aWR5dmVyc2UpCmlmICghcmVxdWlyZSgiZ2dwbG90MiIpKSBpbnN0YWxsX3BhY2thZ2VzKCJnZ3Bsb3QyIikKbGlicmFyeShnZ3Bsb3QyKQppZiAoIXJlcXVpcmUoImdndGhlbWVzIikpIGluc3RhbGxfcGFja2FnZXMoImdndGhlbWVzIikKbGlicmFyeShnZ3RoZW1lcykKaWYgKCFyZXF1aXJlKCJzY2FsZXMiKSkgaW5zdGFsbF9wYWNrYWdlcygic2NhbGVzIikKbGlicmFyeShzY2FsZXMpCmlmICghcmVxdWlyZSgiZ2dmb3JjZSIpKSBpbnN0YWxsX3BhY2thZ2VzKCJnZ2ZvcmNlIikKbGlicmFyeShnZ2ZvcmNlKQppZiAoIXJlcXVpcmUoImdncHViciIpKSBpbnN0YWxsX3BhY2thZ2VzKCJnZ3B1YnIiKQpsaWJyYXJ5KGdncHVicikKaWYgKCFyZXF1aXJlKCdsdWJyaWRhdGUnKSkgaW5zdGFsbF9wYWNrYWdlcygnbHVicmlkYXRlJykKbGlicmFyeShsdWJyaWRhdGUpCmlmICghcmVxdWlyZSgnY2FyJykpIGluc3RhbGxfcGFja2FnZXMoJ2NhcicpCmxpYnJhcnkoY2FyKQppZiAoIXJlcXVpcmUoJ1JtaXNjJykpIGluc3RhbGxfcGFja2FnZXMoJ1JtaXNjJykKbGlicmFyeShSbWlzYykKaWYgKCFyZXF1aXJlKCdiZXN0Tm9ybWFsaXplJykpIGluc3RhbGxfcGFja2FnZXMoJ2Jlc3ROb3JtYWxpemUnKQpsaWJyYXJ5KGJlc3ROb3JtYWxpemUpCmlmICghcmVxdWlyZSgnUGVyZm9ybWFuY2VBbmFseXRpY3MnKSkgaW5zdGFsbF9wYWNrYWdlcygnUGVyZm9ybWFuY2VBbmFseXRpY3MnKQpsaWJyYXJ5KFBlcmZvcm1hbmNlQW5hbHl0aWNzKQppZiAoIXJlcXVpcmUoJ2xtZXJUZXN0JykpIGluc3RhbGxfcGFja2FnZXMoJ2xtZXJUZXN0JykKbGlicmFyeShsbWVyVGVzdCkKaWYgKCFyZXF1aXJlKCdyZXNoYXBlMicpKSBpbnN0YWxsX3BhY2thZ2VzKCdyZXNoYXBlMicpCmxpYnJhcnkocmVzaGFwZTIpCmlmICghcmVxdWlyZSgnZW1tZWFucycpKSBpbnN0YWxsX3BhY2thZ2VzKCdlbW1lYW5zJykKbGlicmFyeShlbW1lYW5zKQppZiAoIXJlcXVpcmUoJ01hYXNsaW4yJykpIGluc3RhbGxfcGFja2FnZXMoJ01hYXNsaW4yJykKbGlicmFyeShNYWFzbGluMikKaWYgKCFyZXF1aXJlKCJlZmZlY3RzIikpIGluc3RhbGwucGFja2FnZXMoImVmZmVjdHMiKQpsaWJyYXJ5KGVmZmVjdHMpCmlmICghcmVxdWlyZSgidmVnYW4iKSkgaW5zdGFsbC5wYWNrYWdlcygidmVnYW4iKQpsaWJyYXJ5KHZlZ2FuKQppZiAoIXJlcXVpcmUoInBhdGNod29yayIpKSBpbnN0YWxsLnBhY2thZ2VzKCJwYXRjaHdvcmsiKQpsaWJyYXJ5KHBhdGNod29yaykKaWYgKCFyZXF1aXJlKCJnZ21hcCIpKSBpbnN0YWxsX3BhY2thZ2VzKCJnZ21hcCIpCmxpYnJhcnkoZ2dtYXApCmlmICghcmVxdWlyZSgibWFwcyIpKSBpbnN0YWxsX3BhY2thZ2VzKCJtYXBzIikKbGlicmFyeShtYXBzKQppZiAoIXJlcXVpcmUoIm1hcGRhdGEiKSkgaW5zdGFsbF9wYWNrYWdlcygibWFwZGF0YSIpCmxpYnJhcnkobWFwZGF0YSkKaWYgKCFyZXF1aXJlKCJwYXJ0UjIiKSkgcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoIm1hc3RvZmZlbC9wYXJ0UjIiKSAKbGlicmFyeShwYXJ0UjIpCmlmICghcmVxdWlyZSgicnNxIikpIGluc3RhbGxfcGFja2FnZXMoInJzcSIpCmxpYnJhcnkocnNxKQppZiAoIXJlcXVpcmUoImNvd3Bsb3QiKSkgaW5zdGFsbF9wYWNrYWdlcygiY293cGxvdCIpCmxpYnJhcnkoY293cGxvdCkKaWYgKCFyZXF1aXJlKCJnZ21hcCIpKSBpbnN0YWxsX3BhY2thZ2VzKCJnZ21hcCIpCmxpYnJhcnkoZ2dtYXApCmlmICghcmVxdWlyZSgibWFwcyIpKSBpbnN0YWxsX3BhY2thZ2VzKCJtYXBzIikKbGlicmFyeShtYXBzKQppZiAoIXJlcXVpcmUoIm1hcGRhdGEiKSkgaW5zdGFsbF9wYWNrYWdlcygibWFwZGF0YSIpCmxpYnJhcnkobWFwZGF0YSkKaWYgKCFyZXF1aXJlKCJwYXRjaHdvcmsiKSkgaW5zdGFsbF9wYWNrYWdlcygicGF0Y2h3b3JrIikKbGlicmFyeShwYXRjaHdvcmspCmlmICghcmVxdWlyZSgiZ2doNHgiKSkgaW5zdGFsbF9wYWNrYWdlcygiZ2doNHgiKQpsaWJyYXJ5KGdnaDR4KQppZiAoIXJlcXVpcmUoImdnYmVlc3dhcm0iKSkgaW5zdGFsbF9wYWNrYWdlcygiZ2diZWVzd2FybSIpCmxpYnJhcnkoZ2diZWVzd2FybSkKYGBgCiMgRnVuY3Rpb25zCmBgYHtyfQpiYWNrdXBfb3B0aW9ucyA8LSBvcHRpb25zKCkgI29ubHkgcnVuIHdoZW4gcmVzdGFydGluZyB0aGUgc2Vzc2lvbiB0byBzYXZlIHRoZSBkZWZhdWx0IG9wdGlvbnMKb3B0aW9ucyhiYWNrdXBfb3B0aW9ucykKc2hhcGVfU2V4IDwtIGMoMTYsIDQpCmNvbG9yX0NhdGVnb3J5IDwtIGMoImRhcmtnb2xkZW5yb2QxIiwgImRhcmtibHVlIikKY29sb3JfSEwgPC0gYygic2llbm5hMSIsICJkZWVwc2t5Ymx1ZSIpCmNvbG9yX2Rpc3RpY3QgPC0gYygiIzAwMDAwMCIsIiMwMDQ5NDkiLCIjMDA5MjkyIiwiI2ZmNmRiNiIsIiNmZmI2ZGIiLAogIiM0OTAwOTIiLCIjMDA2ZGRiIiwiI2I2NmRmZiIsIiM2ZGI2ZmYiLCIjYjZkYmZmIiwKICIjOTIwMDAwIiwiIzkyNDkwMCIsIiNkYjZkMDAiLCIjMjRmZjI0IiwiI2ZmZmY2ZCIpCgpwcm9wZXJDb2xuYW1lcz1mdW5jdGlvbih4KXsKICAgZ3N1YigiICIsICJfIiwgCiAgIGdzdWIoIi0iLCAiXyIsIAogICBnc3ViKCI6IiwgIl8iLCAKICAgZ3N1YigiXFwrIiwgIl8iLCAKICAgZ3N1YigiXFwuIiwgIl8iLAogICBnc3ViKCJcXCgiLCAiIiwgCiAgIGdzdWIoIlxcKSIsICIiLCAKICAgZ3N1YigiXlxcZCIsICIiLCBuYW1lcyh4KSkpKSkpKSkpCn0KCnByb3Blck5hbWVzID0gZnVuY3Rpb24oeCl7CiAgIGdzdWIoIiAiLCAiXyIsIAogICBnc3ViKCItIiwgIl8iLCAKICAgZ3N1YigiOiIsICJfIiwgCiAgIGdzdWIoIlxcKyIsICJfIiwKICAgZ3N1YigiXFwuIiwgIl8iLCAKICAgZ3N1YigiXFwoIiwgIiIsIAogICBnc3ViKCJcXCkiLCAiIiwgCiAgIGdzdWIoIl5cXGQiLCAiIiwgeCkpKSkpKSkpCn0KYGBgCgojIFNldCB3b3JraW5nIGRpcmVjdG9yeSAKYGBge3IgZXZhbCA9IEZBTFNFfQpzZXR3ZChkaXIgPSAiWFhYWCIpCmBgYAojIERhdGEKYGBge3J9CiMgQ2hyaXN0ZW5zZW5lbGxhY2FlIGdsb2JhbCBodW1hbiBzdHVkaWVzCkZpZ3VyZV9nbG9iZV9kYXRhIDwtIGZyZWFkKCIuL2RhdGEvRmlndXJlUzEvbWFwX2RhdGEudHh0IikgJT4lIGRwbHlyOjphcnJhbmdlKC1TYW1wbGVfc2l6ZV9vZl9jb2hvcnQpCgojIG1ldGFkYXRhIGluY2x1ZGluZyBtdXJpbmUgZGF0YSwgYm9keSBjb21wb3NpdGlvbiBtZWFzdXJlbWVudHMsIHdlZWtseSB3ZWlnaHQgbWVhc3VyZW1lbnQsIHNwaWxsZWQgZm9vZCBhbmQgZmVjZXMgaW4gcmVzcGlyb21ldHJ5IGNhZ2VzLCBib21iIGNhbG9yaW1ldHJ5IG1lc3VyZW1lbnRzLCBhbmQgcVBDUiBtZXN1cmVtZW50cwptZXRhZGF0YSA8LSBmcmVhZCgiLi9kYXRhL01ldGFkYXRhL01vdXNlX21ldGFkYXRhLnR4dCIpIApNZXRhZGF0YV9leGNsdWRlX2lkIDwtIGMoNjI5Niw2MzA1LDYzNzQsNjM3MiwgI3NpY2sKICAgICAgICAgICAgICAgICAgICAgICAgIDYzNTAsNjQyNiw2NDUxLCA2NDU1KSAjZGllZAptZXRhZGF0YSA8LSBtZXRhZGF0YSAlPiUgZHBseXI6OmZpbHRlcighc3RyX2RldGVjdChNb3VzZUlELCBwYXN0ZShNZXRhZGF0YV9leGNsdWRlX2lkLCBjb2xsYXBzZT0ifCIpKSkKI1Byb21ldGhpb24KUHJvbWV0aGlvbiA8LSBmcmVhZCgiLi9kYXRhL1Byb21ldGhpb24vUHJvbWV0aGlvbl9kYXRhX3Jhdy50eHQiKQpDaXJjYWRpYW4gPC0gZnJlYWQoIi4vZGF0YS9Qcm9tZXRoaW9uL1Byb21ldGhpb25fZGF0YV9jaXJjYWRpYW4udHh0IikKCiMgTWV0YWJvbG9taWNzCiMjIExDTVMKIyMjIHVudGFyZ2V0ZWQKTENNU194Y21zX291dHB1dCA8LSBmcmVhZCgiLi9kYXRhL01ldGFib2xvbWljcy9MQ01TX3NlcnVtX3VudGFyZ2V0ZWRfWENNUy5kaWZmcmVwb3J0Lk11bHRpQ2xhc3MudHN2IikKIyMjIHRhcmdldGVkCkxDTVNfc2VydW0gPC0gZnJlYWQoIi4vZGF0YS9NZXRhYm9sb21pY3MvTENNU190cmFyZ2V0ZWRfc2VydW1fYXJlYS5jc3YiKSAKIyMgR0MtTVM6IFNDRkEKR0NNU19TQ0ZBcyA8LSBmcmVhZCgiLi9kYXRhL01ldGFib2xvbWljcy9HQ01TX1NDRkFzLnR4dCIpIAoKIyBNZXRhZ2Vub21pY3MKIyMgcVBDUgpxUENSX2RhdGEgPC0gZnJlYWQoIi4vZGF0YS9NZXRhZ2Vub21pY3MvcVBDUl9kYXRhLnR4dCIpIAojIyBTaG90Z3VuIFNlcXVlbmNpbmcKTWV0YWdlbm9taWNzX21ldGFkYXRhX0NDIDwtIGZyZWFkKCIuL2RhdGEvTWV0YWdlbm9taWNzL01ldGFnZW5vbWljc19tZXRhZGF0YV9DQy50eHQiKSAKCk1ldGFnZW5vbWljc19leGNsdWRlX2lkIDwtIGMoIjYyOTYiLCAiNjMwNSIsICI2MzUwIiwgIjYzNzQiLCAiNjM3MiIsICI2NDI2IiwgIjY0NTEiLCAiNjQ1NSIgIyBzaWNrIGFubWFscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIjY0MzQiLCAiNjQyMCIpICNsb3cgRE5BIGV4dHJhY3Rpb24geWllbGQgLS0+IGxvdyBxUENSIHNpZ25hbCAtLT4gbm9ybWFsaXphdGlvbiBub3QgcG9zc2libGUKQnJhY2tlbl9vdHVfdGFibGVfcmVsRnJlcSA8LSBmcmVhZCgiLi9kYXRhL01ldGFnZW5vbWljcy9CcmFja2VuX290dV90YWJsZV9yZWxGcmVxLnR4dCIpICMgd2l0aCBEb25vcgpCcmFja2VuX290dV90YWJsZV9yZWFkcyA8LSBmcmVhZCgiLi9kYXRhL01ldGFnZW5vbWljcy9CcmFja2VuX290dV90YWJsZV9yZWFkcy50eHQiKSAjIHdpdGhvdXQgRG9ub3IKYGBgCgojIEdlbmVyYWwgbW9kaWZpY2F0aW9uIG9mIGRhdGEKIyMgUHJvbWV0aGlvbiB0aW1lIHNlcmllcyByZWNvcmRpbmdzCmBgYHtyfQpzdGFydF9kYXRlIDwtIGFzLkRhdGUoIjIwMjAtMDUtMDEiKSAjZGVmaW5pbmcgY29tbW9uIHN0YXJ0aW5nIGRhdGUgZm9yIGFsbCByZWNvcmRpbmdzCgpQcm9tZXRoaW9uLjIgPC0gUHJvbWV0aGlvbiAlPiUKICBkcGx5cjo6ZmlsdGVyKCFzdHJfZGV0ZWN0KE1vdXNlSUQsIHBhc3RlKE1ldGFkYXRhX2V4Y2x1ZGVfaWQsIGNvbGxhcHNlPSJ8IikpKSAlPiUKICBkcGx5cjo6bXV0YXRlKERhdGUgPSBhcy5QT1NJWGN0KHRydW5jKGFzLlBPU0lYY3QoRGF0ZVRpbWUpLCB1bml0cyA9ICJob3VycyIpKSkgJT4lCiAgZHBseXI6Omdyb3VwX2J5KE1vdXNlSUQpICU+JQogIGRwbHlyOjptdXRhdGUoZGlmZmVyZW5jZV9zdGFydF9kYXRlID0gcm91bmQoYXMubnVtZXJpYyhkaWZmdGltZShhcy5EYXRlKG1pbihEYXRlVGltZSksIGZvcm1hdCA9ICIlWSVtJWQiKSwgc3RhcnRfZGF0ZSwgdW5pdHMgPSAiZGF5IikpKSwgCiAgICAgICAgICAgICAgICBEYXRlX2NvbW1vbiA9IERhdGUgLSBsdWJyaWRhdGU6OmRheXMoZGlmZmVyZW5jZV9zdGFydF9kYXRlKSkgJT4lICMgY3JlYXRlIGEgZGF0ZS1jb2x1bW4gd2l0aCBhIGNvbW1vbiBzdGFydGluZyBkYXRlCiAgZHBseXI6OnVuZ3JvdXAoKSAlPiUKICBkcGx5cjo6bGVmdF9qb2luKG1ldGFkYXRhLCBieSA9IGMoIk1vdXNlSUQiLCAiQmF0Y2giLCAiUHJvbWV0aGlvbl9Qb3NpdGlvbiIpKQpgYGAKCiMjIFByb21ldGhpb24gY2lyY2FkaWFuIHJlY29yZGluZ3MKYGBge3J9CkNpcmNhZGlhbi4yIDwtIENpcmNhZGlhbiAlPiUKICBkcGx5cjo6ZmlsdGVyKCFzdHJfZGV0ZWN0KE1vdXNlSUQsIHBhc3RlKE1ldGFkYXRhX2V4Y2x1ZGVfaWQsIGNvbGxhcHNlPSJ8IikpKSAlPiUKICBkcGx5cjo6bXV0YXRlKFN0YXJ0RGF0ZSA9IGFzLlBPU0lYY3QoU3RhcnREYXRlKSkgJT4lCiAgZHBseXI6Omdyb3VwX2J5KE1vdXNlSUQpICU+JQogIGRwbHlyOjptdXRhdGUoZGlmZmVyZW5jZV9zdGFydF9kYXRlID0gcm91bmQoYXMubnVtZXJpYyhkaWZmdGltZShhcy5EYXRlKG1pbihTdGFydERhdGUpLCBmb3JtYXQgPSAiJVklbSVkIiksIHN0YXJ0X2RhdGUsIHVuaXRzID0gImRheSIpKSksIAogICAgICAgICAgICAgICAgU3RhcnREYXRlX2NvbW1vbiA9IFN0YXJ0RGF0ZSAtIGx1YnJpZGF0ZTo6ZGF5cyhkaWZmZXJlbmNlX3N0YXJ0X2RhdGUpKSAlPiUgIyBjcmVhdGUgYSBkYXRlLWNvbHVtbiB3aXRoIGEgY29tbW9uIHN0YXJ0aW5nIGRhdGUKICBkcGx5cjo6dW5ncm91cCgpICU+JSAKICBkcGx5cjo6ZmlsdGVyKFN0YXJ0RGF0ZV9jb21tb24gIT0gIjIwMjAtMDUtMDQiLCAKICAgICAgICAgICAgICAgIFN0YXJ0RGF0ZV9jb21tb24gIT0gIjIwMjAtMDUtMDEiKSAjIGV4Y2x1ZGUgYWNjbGltYXRpemF0aW9uIGFuZCB0YWtlIGRvd24KYGBgCgoKIyBBbmFseXNpcwpTb3J0ZWQgYnkgcGFyYWdyYXBocyBvZiByZXN1bHRzCiMjIEZpZ3VyZSBTMSAtIEdsb2JhbCBtYXAgb2Ygc3R1ZGllcyBhc3NvY2lhdGluZyB0aGUgZ3V0IGJhY3RlcmlhbCBmYW1pbHkgQ2hyaXN0ZW5zZW5lbGxhY2VhZSB3aXRoIGhlYWx0aHkgYm9keSBtYXNzIGluZGV4IGFuZC9vciBtZXRhYm9saWMgaGVhbHRoIGluIGh1bWFuIGd1dCBtaWNyb2Jpb21lIHN0dWRpZXMuIApgYGB7cn0KRmlndXJlUzEgPC0gZ2dwbG90KCkgKyAKICBnZW9tX3BvbHlnb24oZGF0YSA9IG1hcF9kYXRhKCd3b3JsZCcpLCAKICAgICAgICAgICAgICAgYWVzKHg9bG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCksCiAgICAgICAgICAgICAgIGZpbGw9J2dyYXkyMCcsIGNvbG9yPSd3aGl0ZScsIHNpemU9MC4xKSArCiAgZ2VvbV9wb2ludChkYXRhPUZpZ3VyZV9nbG9iZV9kYXRhLCBhZXMoeD1Mb25nLCB5PUxhdCwgc2l6ZT1TYW1wbGVfc2l6ZV9vZl9jb2hvcnQsIGZpbGwgPSBBc3NvY2lhdGlvbiksCiAgICAgICAgICAgIGFscGhhPTAuNiwgc2hhcGUgPTIxLCBjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjQ0M3OUE3IiwgIiMwMDlFNzMiKSkgKwogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygtMTYwLCAxODApLAogICAgICAgICAgICAgICAgICB5bGltID0gYygtNTAsIDgwKSkgKwogIHNjYWxlX3NpemVfY29udGludW91cygnU2FtcGxlXG5zaXplJywKICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2U9YygxLDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzPWMoMTAwLCA1MDAsIDIwMDAsIDUwMDApKSArCiAgbGFicyh4PSdMb25naXR1ZGUnLCB5PSdMYXRpdHVkZScpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDEwKSArCiAgdGhlbWUoCiAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPWFscGhhKCdsaWdodHN0ZWVsYmx1ZScsIDEpKQogICkgKwogIGd1aWRlcyhmaWxsID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDQsIGFscGhhID0gMSkpLCBzaXplID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2hhcGUgPSAyMSwgY29sb3IgPSAiYmxhY2siKSkpCmBgYApgYGB7ciBmaWcud2lkdGg9Ni41LCBmaWcuaGVpZ2h0PSAzfQpGaWd1cmVTMQpgYGAKYGBge3IgZXZhbCA9IEZBTFNFfQpnZ3NhdmUoIi4vRmlndXJlUzEucGRmIiwgcGxvdCA9IEZpZ3VyZVMxLCBkZXZpY2UgPSBjYWlyb19wZGYsICAKICB3aWR0aCA9IDE2LjUsCiAgaGVpZ2h0ID0gNy41LAogIHVuaXRzID0gImNtIikKYGBgCgojIyBNaWNlIHdpdGggbGl2ZSBDLiBtaW51dGEgc2hvdyBsb3dlciBmZWVkIGVmZmljaWVuY3kgCiMjIyBDLiBtaW51dGEgYWJ1bmRhbmNlCmBgYHtyfQptZXRhZGF0YV9DbWluIDwtIG1ldGFkYXRhICU+JSAKICBkcGx5cjo6ZmlsdGVyKE1vdXNlSUQgIT0gNjQzNCwgTW91c2VJRCAhPSAiNjQyMCIsICMgdG9vIGxvdyBETkEgeWllbGQgZHVyaW5nIEROQSBleHRyYWN0aW9uIC0tPiB0ZWNobmljYWwgaXNzdWUKICAgICAgICAgICAgICAgIE1vdXNlSUQgIT0gNjQ3NykgJT4lCiAgZHBseXI6OmxlZnRfam9pbihxUENSX2RhdGEsIGJ5ID0iTW91c2VJRCIpIyBleHRyZW1lIG91dGxpZXIgYWNjb3JkaW5nIHRvIHJlc2lkdWFscyAtPiBleGNsdWRlZCBmb3Igbm9ybWFsaXR5IHJlYXNvbnMgCgpGaWcxX3FQQ1JfQ21pbjwtbWV0YWRhdGFfQ21pbiAlPiUgCiAgZHBseXI6Om11dGF0ZShDbWluX3Blcl9nQ0NfMWU3ID0gcVBDUl9DbWluX3Blcl9nQ0MgLyAxMDAwMDAwMCkgICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBDYXRlZ29yeSwgeSA9IENtaW5fcGVyX2dDQ18xZTcsIHNoYXBlID0gU2V4LCBjb2xvciA9IENhdGVnb3J5KSkgKyAKICBnZW9tX3F1YXNpcmFuZG9tKGFscGhhID0gMC43LCBzaXplID0gMC43NSkgKwogIHN0YXRfc3VtbWFyeShmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2l6ZT0yLCBhZXMoZ3JvdXAgPSBDYXRlZ29yeSksIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjYsIHNoYXBlID0gMTUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JfQ2F0ZWdvcnksIGxhYmVsID0gYygiS2lsbGVkLUNNIiwgIkxpdmUtQ00iKSwgbmFtZSA9ICJUcmVhdG1lbnQiKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IHNoYXBlX1NleCwgbGFiZWwgPSBjKCJGZW1hbGUiLCAiTWFsZSIpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiS2lsbGVkIiA9ICJLaWxsZWQtXG5DTSIsICJMaXZlIiA9ICJMaXZlLVxuQ00iKSkgKwogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTApICsKICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIGxhYnMoeSA9IGV4cHJlc3Npb24ocGFzdGUoIkMuIG1pbnV0YSAoR0UvZykgeCIsZV43KSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKSAKRmlnMV9xUENSX0NtaW4KYGBgCmBgYHtyfQpzZXQuc2VlZCg1NjkpCm1ldGFkYXRhX0NtaW4kcVBDUl9DbWluX3Blcl9nQ0Nfbm9ybSA8LSBwcmVkaWN0KGJlc3ROb3JtYWxpemUobWV0YWRhdGFfQ21pbiRxUENSX0NtaW5fcGVyX2dDQykpCgpvcHRpb25zKGNvbnRyYXN0cz1jKCJjb250ci5zdW0iLCAiY29udHIucG9seSIpKQptb2RlbF9DbWluPC1sbWVyKHFQQ1JfQ21pbl9wZXJfZ0NDX25vcm0gfiBDYXRlZ29yeSArIHFQQ1JfUm91bmQgKyAoQ2F0ZWdvcnkgfCBCYXRjaCksIGRhdGEgPSBtZXRhZGF0YV9DbWluKQpsbWVyVGVzdDo6c3RlcChtb2RlbF9DbWluKQpgYGAKVGVzdGluZyBtb2RlbCBhc3N1bXB0aW9ucyAobm9ybWFsaXR5IGFuZCBoZXRlcm9zY2VkYXN0aWNpdHkgb2YgcmVzaWR1YWxzKQpgYGB7cn0Kb3B0aW9ucyhjb250cmFzdHM9YygiY29udHIuc3VtIiwgImNvbnRyLnBvbHkiKSkKbW9kZWxfQ21pbi4yPC1sbWVyKHFQQ1JfQ21pbl9wZXJfZ0NDX25vcm0gfiBDYXRlZ29yeSArIHFQQ1JfUm91bmQgKyAoQ2F0ZWdvcnkgfCBCYXRjaCksIGRhdGEgPSBtZXRhZGF0YV9DbWluKQoKc2hhcGlyby50ZXN0KHJlc2lkdWFscyhtb2RlbF9DbWluLjIpKSAjIHRlc3Qgbm9ybWFsaXR5IG9mIHJlc2lkdWFscwphbm92YShsbShyZXNpZHVhbHMobW9kZWxfQ21pbi4yKSB+IGZpdHRlZChtb2RlbF9DbWluLjIpKSkgIyB0ZXN0IGZvciBoZXRlcm9zY2VkYXN0aWNpdHkgCmBgYAoKYGBge3J9CnBsb3QobW9kZWxfQ21pbi4yKQpgYGAKYGBge3J9Cm9wdGlvbnMoY29udHJhc3RzPWMoImNvbnRyLnN1bSIsICJjb250ci5wb2x5IikpCmNhcjo6QW5vdmEobW9kZWxfQ21pbi4yLCB0eXBlID0gIklJIiwgdGVzdC5zdGF0aXN0aWMgPSJGIikKYGBgCkNhbGN1bGF0aW9uIG9mIG1lYW5zIGFuZCBTRCB3aXRoIHJhdyB2YWx1ZXMKYGBge3J9Cm1vZGVsX0NtaW4uZWZmPC1sbWVyKHFQQ1JfQ21pbl9wZXJfZ0NDIH4gQ2F0ZWdvcnkgKyBxUENSX1JvdW5kICsgKENhdGVnb3J5IHwgQmF0Y2gpLCBkYXRhID0gbWV0YWRhdGFfQ21pbikKZWZmZWN0czo6ZWZmZWN0KCJDYXRlZ29yeSIsIG1vZGVsX0NtaW4uZWZmLCBzZSA9VFJVRSkgJT4lIGFzLmRhdGEuZnJhbWUoKQpgYGAKZXhhbWluYXRpb24gb2YgQy4gbWludXRhIGluIERvbm9yIHNhbXBsZQpgYGB7cn0KQnJhY2tlbl9vdHVfdGFibGVfcmVsRnJlcSAlPiUgCiAgZHBseXI6OnNlbGVjdCgtY29udGFpbnMoTWV0YWdlbm9taWNzX2V4Y2x1ZGVfaWQpLCAtdGF4b25vbXkpICU+JSAKICBkcGx5cjo6ZmlsdGVyKE9UVV9JRCA9PSAic19fQ2hyaXN0ZW5zZW5lbGxhIG1pbnV0YSIpICU+JQogIGRwbHlyOjpyZW5hbWUocm93bmFtZSA9IE9UVV9JRCkgJT4lIAogIHRpZHlyOjpnYXRoZXIodmFyLCB2YWx1ZSwgLXJvd25hbWUpICU+JSAKICB0aWR5cjo6c3ByZWFkKHJvd25hbWUsIHZhbHVlKSAlPiUgCiAgZHBseXI6OnJlbmFtZShzYW1wbGVpZCA9IHZhciwgc19fQ21pbl9yZWwgPSAic19fQ2hyaXN0ZW5zZW5lbGxhIG1pbnV0YSIpICU+JSAKICBkcGx5cjo6bGVmdF9qb2luKE1ldGFnZW5vbWljc19tZXRhZGF0YV9DQywgYnkgPSJzYW1wbGVpZCIpICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4obWV0YWRhdGEsIGJ5ID0iTW91c2VJRCIpICU+JQogIGRwbHlyOjptdXRhdGUoQ2F0ZWdvcnkgPSBpZmVsc2UoZ3JlcGwoIkRvbm9yIiwgc2FtcGxlaWQpLCAiRG9ub3IiLCBDYXRlZ29yeSkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBDYXRlZ29yeSwgeSA9IHNfX0NtaW5fcmVsLCBjb2xvciA9IENhdGVnb3J5KSkgKyAKICBnZW9tX3F1YXNpcmFuZG9tKGFscGhhID0gMC43LCBzaXplID0gMC43NSkgKwogIHN0YXRfc3VtbWFyeShmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2l6ZT0yLCBhZXMoZ3JvdXAgPSBDYXRlZ29yeSksIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjYsIHNoYXBlID0gMTUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiYmxhY2siLCBjb2xvcl9DYXRlZ29yeSksIGxhYmVsID0gYygiRG9ub3IiLCJLaWxsZWQtQ00iLCAiTGl2ZS1DTSIpLCBuYW1lID0gIlRyZWF0bWVudCIpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gc2hhcGVfU2V4LCBsYWJlbCA9IGMoIkZlbWFsZSIsICJNYWxlIikpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJLaWxsZWQiID0gIktpbGxlZC1cbkNNIiwgIkxpdmUiID0gIkxpdmUtXG5DTSIpKSArCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxMCkgKwogIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgbGFicyh5ID0gInJlbGF0aXZlIEMubWludXRhIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpCmBgYAojIyMgTXVyaW5lIHdlaWdodCBhbmQgYm9keSBjb21wb3NpdGlvbgojIyMjIEJvZHkgd2VpZ2h0CmBgYHtyfQptZXRhZGF0YV93ZWlnaHQgPC0gbWV0YWRhdGEgJT4lIAogIGRwbHlyOjptdXRhdGUoQ2F0ZWdvcnlfU2V4ID0gcGFzdGUoQ2F0ZWdvcnksIFNleCwgc2VwPSJfIikpICU+JQogIGRwbHlyOjpzZWxlY3QoTW91c2VJRCwgQmF0Y2gsIFNleCwgQ2F0ZWdvcnksIENhdGVnb3J5X1NleCwgTGl0dGVyLCBUMF93ZWlnaHQsIFQxX3dlaWdodCwgVDJfd2VpZ2h0LCBUM193ZWlnaHQsIFByb21ldGhpb25fd2VpZ2h0KSAlPiUKICBkcGx5cjo6cmVuYW1lKCI3IiA9ICJUMV93ZWlnaHQiLCAiMTQiID0gIlQyX3dlaWdodCIsICIyMSIgPSAiVDNfd2VpZ2h0IiwgIjI4IiA9ICJQcm9tZXRoaW9uX3dlaWdodCIpICU+JQogIHRpZHlyOjpnYXRoZXIoRGF5LCB3ZWlnaHQsICI3IjoiMjgiKQoKbWV0YWRhdGFfd2VpZ2h0X3dpdGhUMDwtIG1ldGFkYXRhICU+JQogIGRwbHlyOjptdXRhdGUoQ2F0ZWdvcnlfU2V4ID0gcGFzdGUoQ2F0ZWdvcnksIFNleCwgc2VwPSJfIikpICU+JQogIGRwbHlyOjpzZWxlY3QoTW91c2VJRCwgQmF0Y2gsIFNleCwgQ2F0ZWdvcnksIENhdGVnb3J5X1NleCwgTGl0dGVyLCBUMF93ZWlnaHQsIFQxX3dlaWdodCwgVDJfd2VpZ2h0LCBUM193ZWlnaHQsIFByb21ldGhpb25fd2VpZ2h0KSAlPiUKICBkcGx5cjo6cmVuYW1lKCIwIiA9ICJUMF93ZWlnaHQiLCAiNyIgPSAiVDFfd2VpZ2h0IiwgIjE0IiA9ICJUMl93ZWlnaHQiLCAiMjEiID0gIlQzX3dlaWdodCIsICIyOCIgPSAiUHJvbWV0aGlvbl93ZWlnaHQiKSAlPiUKICB0aWR5cjo6Z2F0aGVyKERheSwgd2VpZ2h0LCAiMCI6IjI4IikgJT4lCiAgZHBseXI6Om11dGF0ZShEYXkgPSBhcy5udW1lcmljKERheSkpCgptZXRhZGF0YV93ZWlnaHRfd2l0aFQwLjIgPC0gbmEub21pdChtZXRhZGF0YV93ZWlnaHRfd2l0aFQwKQoKbWV0YWRhdGFfd2VpZ2h0X3dpdGhUMF9zdW1tYXJ5IDwtIFJtaXNjOjpzdW1tYXJ5U0UobWV0YWRhdGFfd2VpZ2h0X3dpdGhUMC4yLCBtZWFzdXJldmFyID0gICJ3ZWlnaHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXB2YXIgPSBjKCJDYXRlZ29yeSIsICJEYXkiLCAiU2V4IiwgIkNhdGVnb3J5X1NleCIpLCBjb25mLmludGVydmFsID0gMC45NSkKCkZpZ1MyX3dlaWdodCA8LSBnZ3Bsb3QobWV0YWRhdGFfd2VpZ2h0X3dpdGhUMF9zdW1tYXJ5LCBhZXMoeD1EYXksIHk9d2VpZ2h0LCBncm91cD1DYXRlZ29yeV9TZXgsIGNvbG9yPUNhdGVnb3J5KSkgKyAKICBnZW9tX2xpbmUoYWxwaGEgPSAwLjcpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPXdlaWdodC1jaSwgeW1heD13ZWlnaHQrY2kpLAogICAgICAgICAgICAgICAgIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuMDUpLCBhbHBoYSA9IDAuNywgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gU2V4KSwgc2l6ZSA9IDMsIGFscGhhID0xKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1zaGFwZV9TZXgpICsKICBsYWJzKHkgPSAiV2VpZ2h0IChnKSIsIHggPSAiRGF5cyIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWNvbG9yX0NhdGVnb3J5LCBsYWJlbCA9IGMoZXhwcmVzc2lvbihpdGFsaWMoIktpbGxlZC1DTSIpKSwgZXhwcmVzc2lvbihpdGFsaWMoIkxpdmUtQ00iKSkpLCBuYW1lID0gIlRyZWF0bWVudCIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygwLCA3LCAxNCwgMjEsIDI1LCAyOCkpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDEwKSAKRmlnUzJfd2VpZ2h0CmBgYApzdGF0aXN0aWNhbCBhbmFseXNpcwpgYGB7cn0Kc2V0LnNlZWQoNjczKQptZXRhZGF0YV93ZWlnaHQkd2VpZ2h0X25vcm08LSBwcmVkaWN0KGJlc3ROb3JtYWxpemUobWV0YWRhdGFfd2VpZ2h0JHdlaWdodCkpCm1ldGFkYXRhX3dlaWdodCRUMF93ZWlnaHRfbm9ybTwtIHByZWRpY3QoYmVzdE5vcm1hbGl6ZShtZXRhZGF0YV93ZWlnaHQkVDBfd2VpZ2h0KSkKCm1ldGFkYXRhX3dlaWdodCREYXlfZmFjdG9yIDwtIGFzLmZhY3RvcihtZXRhZGF0YV93ZWlnaHQkRGF5KQptZXRhZGF0YV93ZWlnaHQkTW91c2VJRF9mYWN0b3IgPC0gYXMuZmFjdG9yKG1ldGFkYXRhX3dlaWdodCRNb3VzZUlEKQoKb3B0aW9ucyhjb250cmFzdHM9YygiY29udHIuc3VtIiwgImNvbnRyLnBvbHkiKSkKbW9kZWxfd2VpZ2h0PC0gbG1lclRlc3Q6OmxtZXIod2VpZ2h0X25vcm0gfiBDYXRlZ29yeSpTZXgqRGF5X2ZhY3RvciArIFQwX3dlaWdodF9ub3JtICsgKDF8QmF0Y2gvU2V4KSArICgxfE1vdXNlSURfZmFjdG9yL0JhdGNoL1NleCksIGRhdGEgPSBtZXRhZGF0YV93ZWlnaHQpCmxtZXJUZXN0OjpzdGVwKG1vZGVsX3dlaWdodCwga2VlcCA9ICJDYXRlZ29yeSIpCmBgYAotLT4gbm90IHNpZ25pZmljYW50IGZvciBjYXRnZW90eSBvciBpbnRlcmFjdGlvbnMgb2YgY2F0ZWdvcnkgd2lydGggb3RoZXIgdmFyaWFibGVzCi0tPiBubyB0cmVhdG1lbnQgZWZmZWN0IG9uIHdlaWdodAoKIyMjIyBBZGlwb3NpdHkgZ2FpbgpgYGB7cn0KbWV0YWRhdGFfZ2FpbiA8LSBtZXRhZGF0YSAlPiUKICBkcGx5cjo6bXV0YXRlKFQwX2ZhdHBlcmMgPSBUMF9mYXRtYXNzL1QwX3dlaWdodCoxMDAsIAogICAgICAgICAgICAgICAgVDRfZmF0cGVyYyA9IFQ0X2ZhdG1hc3MvVDRfd2VpZ2h0KjEwMCwgCiAgICAgICAgICAgICAgICBhZGlwb3NpdHlfZ2FpbiA9IFQ0X2ZhdHBlcmMgLSBUMF9mYXRwZXJjKSAlPiUKICBkcGx5cjo6c2VsZWN0KE1vdXNlSUQsIFNleCwgQmF0Y2gsIENhdGVnb3J5LCBMaXR0ZXIsIFByb21ldGhpb25fQ2FiaW5ldCwgVDBfZmF0cGVyYywgVDRfZmF0cGVyYywgVDBfd2VpZ2h0LCBhZGlwb3NpdHlfZ2FpbikgCgpGaWcxX2FkaXBvc2l0eSA8LSBtZXRhZGF0YV9nYWluICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBDYXRlZ29yeSwgeSA9IGFkaXBvc2l0eV9nYWluLCBzaGFwZSA9IFNleCwgY29sb3IgPSBDYXRlZ29yeSkpICsgCiAgZ2VvbV9xdWFzaXJhbmRvbShhbHBoYSA9IDAuNywgc2l6ZSA9IDAuNzUpICsKICBzdGF0X3N1bW1hcnkoZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNpemU9MiwgYWVzKGdyb3VwID0gQ2F0ZWdvcnkpLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC42LCBzaGFwZSA9IDE1KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX0NhdGVnb3J5LCBsYWJlbCA9IGMoIktpbGxlZC1DTSIsICJMaXZlLUNNIiksIG5hbWUgPSAiVHJlYXRtZW50IikgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBzaGFwZV9TZXgsIGxhYmVsID0gYygiRmVtYWxlIiwgIk1hbGUiKSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIktpbGxlZCIgPSAiS2lsbGVkLVxuQ00iLCAiTGl2ZSIgPSAiTGl2ZS1cbkNNIikpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDEwKSArCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICBsYWJzKHkgPSAiQWRpcG9zaXR5IGdhaW4gKCUpIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpICAKRmlnMV9hZGlwb3NpdHkKYGBgCnN0YXRpc3RpY2FsIGFuYWx5c2lzIApgYGB7cn0Kb3B0aW9ucyhjb250cmFzdHM9YygiY29udHIuc3VtIiwgImNvbnRyLnBvbHkiKSkKbW9kZWxfYWRpcG9zaXR5X2dhaW4gPC0gbG1lclRlc3Q6OmxtZXIoYWRpcG9zaXR5X2dhaW4gfiBDYXRlZ29yeSpTZXggKyBUMF9mYXRwZXJjKlQwX3dlaWdodCArKDF8QmF0Y2gvU2V4KSwgZGF0YSA9IG1ldGFkYXRhX2dhaW4pCmxtZXJUZXN0OjpzdGVwKG1vZGVsX2FkaXBvc2l0eV9nYWluLCBrZWVwID0gIkNhdGVnb3J5IikKYGBgCmBgYHtyfQptb2RlbF9hZGlwb3NpdHlfZ2Fpbi4yIDwtIGxtKGFkaXBvc2l0eV9nYWluIH4gQ2F0ZWdvcnkrIFQwX2ZhdHBlcmMsIGRhdGEgPSBtZXRhZGF0YV9nYWluKQpzdGF0czo6c2hhcGlyby50ZXN0KHJlc2lkKG1vZGVsX2FkaXBvc2l0eV9nYWluLjIpKSAjIHRlc3Qgbm9ybWFsaXR5IG9mIHJlc2lkdWFscwphbm92YShsbShyZXNpZHVhbHMobW9kZWxfYWRpcG9zaXR5X2dhaW4uMil+Zml0dGVkLnZhbHVlcyhtb2RlbF9hZGlwb3NpdHlfZ2Fpbi4yKSkpICMgdGVzdCBmb3IgaGV0ZXJvc2NlZGFzdGljaXR5IApgYGAKYGBge3J9CnBsb3QobW9kZWxfYWRpcG9zaXR5X2dhaW4uMikKYGBgCmBgYHtyfQpvcHRpb25zKGNvbnRyYXN0cz1jKCJjb250ci5zdW0iLCAiY29udHIucG9seSIpKQpjYXI6OkFub3ZhKG1vZGVsX2FkaXBvc2l0eV9nYWluLjIsIHRlc3Quc3RhdGlzdGljPSJGIiwgdHlwZSA9ICJJSUkiKQpgYGAKLT4gbm8gdHJlYXRtZW50IGVmZmVjdAoKCgoKIyMjIEZvb2QgaW50YWtlIGFuZCBmZWVkaW5nIGVmZmljaWVuY3kKYGBge3J9ClByb21ldGhpb25fRm9vZCA8LSBQcm9tZXRoaW9uLjIgJT4lIAogIGRwbHlyOjpmaWx0ZXIoTW91c2VJRCAhPSA2NDM4LCBNb3VzZUlEICE9IDY0NTApICU+JSAjIHNwaWxsZWQgZm9vZCBpbnRvIGNhZ2UsIGFzIG1vdXNlIHdhcyBub3QgZWF0aW5nIGZyb20gaG9wcGVyCiAgZHBseXI6OmZpbHRlcihEYXRlX2NvbW1vbiA9PSBhcy5QT1NJWGN0KCIyMDIwLTA1LTA0IDA4OjAwOjAwIikpICU+JSAjIGZpbHRlciBlbmRwb2ludCBkYXRhIHRvIG9idGFpbiBmb29kIGVhdGVuIGF0IHRoZSBlbmQgb2YgdGhlIGV4cGVyaW1lbnQKICB0aWR5cjo6ZHJvcF9uYShQcm9tZXRoaW9uX3dlaWdodCkgJT4lCiAgZHBseXI6Om11dGF0ZShGb29kX2NvcnJlY3RlZCA9IEZvb2RJbkFfTSAtIFNwaWxsZWRfRm9vZF9jYWdlLCAKICAgICAgICAgICAgICAgIEZJX2tjYWwgPSBGb29kX2NvcnJlY3RlZCozLjQwNjU1NywgCiAgICAgICAgICAgICAgICBGSV9rY2FsX2RheSA9IEZJX2tjYWwvNzAqMjQsIAogICAgICAgICAgICAgICAgRklfa2NhbF9kYXlfQlcgPSBGSV9rY2FsX2RheS9Qcm9tZXRoaW9uX3dlaWdodCkgJT4lCiAgZHBseXI6Omdyb3VwX2J5KFNleCkgJT4lICMgZXhjbHVkZSBvdXRsaWVycywgYXMgc3BpbGxlZCBmb29kIG1pZ2h0IGhhdmUgbWVhc3VyZW1lbnQgZXJyb3JzCiAgZHBseXI6Om11dGF0ZShsb3dlcl9ib3VuZF9GSV9rY2FsX2RheV9CVyA9IG1lZGlhbihGSV9rY2FsX2RheV9CVykgLSAzLjUgKm1hZChGSV9rY2FsX2RheV9CVyksIAogICAgICAgICAgICAgICAgdXBwZXJfYm91bmRfRklfa2NhbF9kYXlfQlcgPSBtZWRpYW4oRklfa2NhbF9kYXlfQlcpICsgMy41ICogbWFkKEZJX2tjYWxfZGF5X0JXKSkgJT4lCiAgZHBseXI6OnVuZ3JvdXAoKSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoTW91c2VJRCkgJT4lCiAgZHBseXI6OmZpbHRlcihkcGx5cjo6YmV0d2VlbihGSV9rY2FsX2RheV9CVywgbG93ZXJfYm91bmRfRklfa2NhbF9kYXlfQlcsIHVwcGVyX2JvdW5kX0ZJX2tjYWxfZGF5X0JXKSkgJT4lIAogIGRwbHlyOjp1bmdyb3VwKCkgJT4lCiAgZHBseXI6Om11dGF0ZShGZWVkX2VmaWNpZW5jeSA9ICgoVDZfd2VpZ2h0IC0gVDBfd2VpZ2h0KS8yOCkvRklfa2NhbF9kYXkpCmBgYAoKIyMjIyBGb29kIGludGFrZQpgYGB7cn0KRmlnMV9mb29kaW50YWtlX3dlaWdodDwtIFByb21ldGhpb25fRm9vZCAlPiUKICBnZ3Bsb3QoYWVzKHg9IFByb21ldGhpb25fd2VpZ2h0ICx5PUZJX2tjYWxfZGF5LCBjb2xvciA9IENhdGVnb3J5LCBncm91cCA9IENhdGVnb3J5KSkgKwogIGdlb21fc21vb3RoKCBtZXRob2QgPSAibG0iLCBzZSA9IEYsIGFscGhhID0gMC44LCBzaXplID0gMC41LCBzaG93LmxlZ2VuZCA9IEYpKyAKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IFNleCksIGFscGhhID0wLjcsIHNpemUgPTAuNzUsIHNob3cubGVnZW5kID0gVCkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXM9YygxNiwgNCksIG5hbWUgPSAiU2V4IiwgbGFiZWwgPSBjKCJGZW1hbGUiLCAiTWFsZSIpKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9Yyhjb2xvcl9DYXRlZ29yeSksIGxhYmVsID0gYygiS2lsbGVkLUNNIiwgIkxpdmUtQ00iKSwgbmFtZSA9ICJUcmVhdG1lbnQiKSArCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxMCkgKwogIGxhYnMoeSA9ICJGb29kIGludGFrZSAoa2NhbC9kKSIsIHggPSAiV2VpZ2h0IChnKSIpIApGaWcxX2Zvb2RpbnRha2Vfd2VpZ2h0CmBgYApIaWdoZXIgZm9vZCBpbnRha2UgIApTdGF0aXN0aWNhbCBhbmFseXNpczoKYGBge3J9CnNldC5zZWVkKDYyOCkKUHJvbWV0aGlvbl9Gb29kJEZJX2tjYWxfZGF5X25vcm0gPC0gcHJlZGljdChiZXN0Tm9ybWFsaXplKFByb21ldGhpb25fRm9vZCRGSV9rY2FsX2RheSkpClByb21ldGhpb25fRm9vZCRQcm9tZXRoaW9uX3dlaWdodF9ub3JtIDwtIHByZWRpY3QoYmVzdE5vcm1hbGl6ZShQcm9tZXRoaW9uX0Zvb2QkUHJvbWV0aGlvbl93ZWlnaHQpKQoKb3B0aW9ucyhjb250cmFzdHM9YygiY29udHIuc3VtIiwgImNvbnRyLnBvbHkiKSkKbW9kZWxfZm9vZCA8LSBsbWVyVGVzdDo6bG1lcihGSV9rY2FsX2RheV9ub3JtIH4gQ2F0ZWdvcnkqU2V4ICsgU2V4KlByb21ldGhpb25fd2VpZ2h0X25vcm0gKyAoQ2F0ZWdvcnl8QmF0Y2gvU2V4L1Byb21ldGhpb25fQ2FiaW5ldCksIGRhdGEgPSBQcm9tZXRoaW9uX0Zvb2QpCmxtZXJUZXN0OjpzdGVwKG1vZGVsX2Zvb2QsIGtlZXAgPSAiQ2F0ZWdvcnkiKQpgYGAKYGBge3J9Cm9wdGlvbnMoY29udHJhc3RzPWMoImNvbnRyLnN1bSIsICJjb250ci5wb2x5IikpCm1vZGVsX2Zvb2QuMiA8LSBsbShGSV9rY2FsX2RheV9ub3JtIH4gQ2F0ZWdvcnkrU2V4K1Byb21ldGhpb25fd2VpZ2h0X25vcm0sIGRhdGEgPSBQcm9tZXRoaW9uX0Zvb2QpCnN0YXRzOjpzaGFwaXJvLnRlc3QocmVzaWR1YWxzKG1vZGVsX2Zvb2QuMikpCmFub3ZhKGxtKHJlc2lkdWFscyhtb2RlbF9mb29kLjIpfmZpdHRlZC52YWx1ZXMobW9kZWxfZm9vZC4yKSkpCmBgYApgYGB7cn0KcGxvdChtb2RlbF9mb29kLjIpCmBgYApgYGB7cn0Kb3B0aW9ucyhjb250cmFzdHM9YygiY29udHIuc3VtIiwgImNvbnRyLnBvbHkiKSkKY2FyOjpBbm92YShtb2RlbF9mb29kLjIsIHRlc3Quc3RhdGlzdGljPSJGIiwgdHlwZSA9ICJJSSIpCmBgYApgYGB7cn0KbW9kZWxfZm9vZF9lZmYgPC0gbG0oRklfa2NhbF9kYXkgfiBDYXRlZ29yeStTZXgrUHJvbWV0aGlvbl93ZWlnaHQsIGRhdGEgPSBQcm9tZXRoaW9uX0Zvb2QpCmVmZmVjdHM6OmVmZmVjdCgiQ2F0ZWdvcnkiLCBtb2RlbF9mb29kX2VmZiwgc2UgPVRSVUUpICU+JSBhcy5kYXRhLmZyYW1lKCkKYGBgCmBgYHtyfQooMTQuMjU2NzAtMTMuNTk0MzcpCigxNC4yNTY3MC0xMy41OTQzNykvMTMuNTk0MzcqMTAwCmBgYApgYGB7cn0KbW9kZWxfZm9vZC5yZXNpZHVhbHMgPC0gbG0oRklfa2NhbF9kYXlfbm9ybSB+IFNleCArIFByb21ldGhpb25fd2VpZ2h0X25vcm0sIGRhdGEgPSBQcm9tZXRoaW9uX0Zvb2QpClByb21ldGhpb25fRm9vZCRGSV9rY2FsX2RheV9yZXNpZHVhbHMgPC0gcmVzaWR1YWxzKG1vZGVsX2Zvb2QucmVzaWR1YWxzKS9zaWdtYShtb2RlbF9mb29kLnJlc2lkdWFscykKCkZpZzFfZm9vZGludGFrZV9yZXNpZCA8LSBQcm9tZXRoaW9uX0Zvb2QgJT4lCiAgZ2dwbG90KGFlcyh4ID0gQ2F0ZWdvcnksIHkgPSBGSV9rY2FsX2RheV9yZXNpZHVhbHMsIHNoYXBlID0gU2V4LCBjb2xvciA9IENhdGVnb3J5KSkgKyAKICBnZW9tX3F1YXNpcmFuZG9tKGFscGhhID0gMC43LCBzaXplID0gMC43NSkgKwogIHN0YXRfc3VtbWFyeShmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2l6ZT0yLCBhZXMoZ3JvdXAgPSBDYXRlZ29yeSksIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjYsIHNoYXBlID0gMTUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JfQ2F0ZWdvcnksIGxhYmVsID0gYygiS2lsbGVkLUNNIiwgIkxpdmUtQ00iKSwgbmFtZSA9ICJUcmVhdG1lbnQiKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IHNoYXBlX1NleCwgbGFiZWwgPSBjKCJGZW1hbGUiLCAiTWFsZSIpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiS2lsbGVkIiA9ICJLaWxsZWQtXG5DTSIsICJMaXZlIiA9ICJMaXZlLVxuQ00iKSkgKwogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTApICsKICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIGxhYnMoeSA9ICJBZGouIGZvb2QgaW50YWtlIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpIApGaWcxX2Zvb2RpbnRha2VfcmVzaWQKYGBgCgojIyMjIEZlZWQgZWZmaWNpZW5jeQpgYGB7cn0KRmlnMV9mZWVkX2VmZjwtIFByb21ldGhpb25fRm9vZCAlPiUKICBnZ3Bsb3QoYWVzKHggPSBDYXRlZ29yeSwgeSA9IEZlZWRfZWZpY2llbmN5LCBzaGFwZSA9IFNleCwgY29sb3IgPSBDYXRlZ29yeSkpICsgCiAgZ2VvbV9xdWFzaXJhbmRvbShhbHBoYSA9IDAuNywgc2l6ZSA9IDAuNzUpICsKICBzdGF0X3N1bW1hcnkoZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNpemU9MiwgYWVzKGdyb3VwID0gQ2F0ZWdvcnkpLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC42LCBzaGFwZSA9IDE1KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX0NhdGVnb3J5LCBsYWJlbCA9IGMoIktpbGxlZC1DTSIsICJMaXZlLUNNIiksIG5hbWUgPSAiVHJlYXRtZW50IikgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBzaGFwZV9TZXgsIGxhYmVsID0gYygiRmVtYWxlIiwgIk1hbGUiKSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIktpbGxlZCIgPSAiS2lsbGVkLVxuQ00iLCAiTGl2ZSIgPSAiTGl2ZS1cbkNNIikpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDEwKSArCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICBsYWJzKHkgPSAiRmVlZCBlZmZpY2ljZW5jeSAoZy9rY2FsKSIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKSAKRmlnMV9mZWVkX2VmZgpgYGAKTG93ZXIgZmVlZCBlZmZpY2llbmN5IApTdGF0aXN0aWNhbCBhbmFseXNpczogCmBgYHtyfQpzZXQuc2VlZCg4NzY1KQpQcm9tZXRoaW9uX0Zvb2QkRmVlZF9lZmljaWVuY3lfbm9ybSA8LSBwcmVkaWN0KGJlc3ROb3JtYWxpemUoUHJvbWV0aGlvbl9Gb29kJEZlZWRfZWZpY2llbmN5KSkKCm9wdGlvbnMoY29udHJhc3RzPWMoImNvbnRyLnN1bSIsICJjb250ci5wb2x5IikpCm1vZGVsX2ZlZWRfZWZmIDwtIGxtZXIoRmVlZF9lZmljaWVuY3lfbm9ybSB+IFNleCpDYXRlZ29yeSArIChDYXRlZ29yeSB8QmF0Y2gvU2V4L1Byb21ldGhpb25fQ2FiaW5ldCksIGRhdGEgPSBQcm9tZXRoaW9uX0Zvb2QpCnN0ZXAobW9kZWxfZmVlZF9lZmYsIGtlZXAgPSAiQ2F0ZWdvcnkiKQpgYGAKYGBge3J9Cm1vZGVsX2ZlZWRfZWZmLjIgPC0gbG1lcihGZWVkX2VmaWNpZW5jeV9ub3JtIH4gQ2F0ZWdvcnkgICsgKDEgfCBCYXRjaCksIGRhdGEgPSBQcm9tZXRoaW9uX0Zvb2QpCnN0YXRzOjpzaGFwaXJvLnRlc3QocmVzaWR1YWxzKG1vZGVsX2ZlZWRfZWZmLjIpKQphbm92YShsbShyZXNpZHVhbHMobW9kZWxfZmVlZF9lZmYuMil+Zml0dGVkLnZhbHVlcyhtb2RlbF9mZWVkX2VmZi4yKSkpCmBgYApgYGB7cn0KcGxvdChtb2RlbF9mZWVkX2VmZi4yKQpgYGAKYGBge3J9Cm9wdGlvbnMoY29udHJhc3RzPWMoImNvbnRyLnN1bSIsICJjb250ci5wb2x5IikpCmNhcjo6QW5vdmEobW9kZWxfZmVlZF9lZmYuMiwgdGVzdC5zdGF0aXN0aWM9IkYiLCB0eXBlID0gIklJIikKYGBgCmBgYHtyfQptb2RlbF9mZWVkX2VmZl9lZmYgPC0gbG1lcihGZWVkX2VmaWNpZW5jeSB+IENhdGVnb3J5ICArICgxIHwgQmF0Y2gpLCBkYXRhID0gUHJvbWV0aGlvbl9Gb29kKQplZmZlY3RzOjplZmZlY3QoIkNhdGVnb3J5IiwgbW9kZWxfZmVlZF9lZmZfZWZmKQpgYGAKYGBge3J9CmFzLmRhdGEuZnJhbWUoZWZmZWN0KCJDYXRlZ29yeSIsIG1vZGVsX2ZlZWRfZWZmX2VmZiwgc2UgPSBUUlVFKSkKYGBgCiMjIyBGZWNhbCBlbmVyZ3kgbG9zcwpgYGB7cn0KbWV0YWRhdGFfYmMgPC0gbWV0YWRhdGEgICU+JQogIGRwbHlyOjptdXRhdGUoYm9tYmNhbF9DYWxvcmlmaWNfVmFsdWVfa2NhbCA9IGJvbWJjYWxfQ2Fsb3JpZmljX1ZhbHVlLzQxODQsICMgY29udmVydCBib21iY2FsX0NhbG9yaWZpY19WYWx1ZSBmcm9tIEovZyB0byBrY2FsL2cKICAgICAgICAgICAgICAgIGJvbWJjYWxfQ2Fsb3JpZmljX1ZhbHVlX2tjYWxfdG90YWwgPSBib21iY2FsX0NhbG9yaWZpY19WYWx1ZV9rY2FsKmJvbWJjYWxfRHJ5X3NhbXBsZV9tYXNzLCAgIyB0b3RhbCBlbmVyZ3kgY29udGVudCBvZiAzIGRheXMgaW4gbWV0YWJvbGljIGNhZ2VzCiAgICAgICAgICAgICAgICBib21iY2FsX0NhbG9yaWZpY19WYWx1ZV9rY2FsX3RvdGFsX2RheSA9IGJvbWJjYWxfQ2Fsb3JpZmljX1ZhbHVlX2tjYWxfdG90YWwvNzAqMjQsICMgY2FsY3VsYXRlIGRhaWx5IGVuZXJneSBleGNyZXRpb24KICAgICAgICAgICAgICAgIGJvbWJjYWxfd2VpZ2h0ID0gYm9tYmNhbF9DYWxvcmlmaWNfVmFsdWVfa2NhbF90b3RhbF9kYXkgLyBQcm9tZXRoaW9uX3dlaWdodCkgJT4lICMgbm9ybWFsaXphdGlvbiBieSBtdXJpbmUgYm9keSB3ZWlnaHQgZm9yIG91dGxpZXIgZGV0ZWN0aW9uCiAgdGlkeXI6OmRyb3BfbmEoYm9tYmNhbF93ZWlnaHQpICU+JQogIGRwbHlyOjpncm91cF9ieSgpICU+JQogIGRwbHlyOjptdXRhdGUobG93ZXJfYm91bmRfYm9tYmNhbF93ZWlnaHQ9IG1lZGlhbihib21iY2FsX3dlaWdodCwgcm0ubmEgPSBUUlVFKSAtIDMgKm1hZChib21iY2FsX3dlaWdodCksCiAgICAgICAgICAgICAgICB1cHBlcl9ib3VuZF9ib21iY2FsX3dlaWdodCA9IG1lZGlhbihib21iY2FsX3dlaWdodCwgcm0ubmEgPSBUUlVFKSArIDMgKiBtYWQoYm9tYmNhbF93ZWlnaHQpKSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoTW91c2VJRCkgJT4lCiAgZHBseXI6OmZpbHRlcihkcGx5cjo6YmV0d2Vlbihib21iY2FsX3dlaWdodCwgbG93ZXJfYm91bmRfYm9tYmNhbF93ZWlnaHQsIHVwcGVyX2JvdW5kX2JvbWJjYWxfd2VpZ2h0KSkgJT4lICMgZXhjbHVkZSBvdXRsaWVycyAKICBkcGx5cjo6dW5ncm91cCgpIApgYGAKIyMjIyBGZWNhbCBtYXNzCmBgYHtyfQptZXRhZGF0YV9iYyU+JQogIGdncGxvdChhZXMoeCA9IENhdGVnb3J5LCB5ID0gYm9tYmNhbF9Ecnlfc2FtcGxlX21hc3MsIHNoYXBlID0gU2V4LCBjb2xvciA9IENhdGVnb3J5KSkgKyAKICBnZW9tX3F1YXNpcmFuZG9tKGFscGhhID0gMC43LCBzaXplID0gMC43NSkgKwogIHN0YXRfc3VtbWFyeShmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2l6ZT0yLCBhZXMoZ3JvdXAgPSBDYXRlZ29yeSksIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjYsIHNoYXBlID0gMTUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JfQ2F0ZWdvcnksIGxhYmVsID0gYygiS2lsbGVkLUNNIiwgIkxpdmUtQ00iKSwgbmFtZSA9ICJUcmVhdG1lbnQiKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IHNoYXBlX1NleCwgbGFiZWwgPSBjKCJGZW1hbGUiLCAiTWFsZSIpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiS2lsbGVkIiA9ICJLaWxsZWQtXG5DTSIsICJMaXZlIiA9ICJMaXZlLVxuQ00iKSkgKwogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTApICsKICBsYWJzKHkgPSAiRmVjYWwgbWFzcyAoZykiKSArCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKSAKYGBgCmBgYHtyfQpzZXQuc2VlZCg2MjgpCgptZXRhZGF0YV9iYyRQcm9tZXRoaW9uX3dlaWdodF9ub3JtIDwtIHByZWRpY3QoYmVzdE5vcm1hbGl6ZShtZXRhZGF0YV9iYyRQcm9tZXRoaW9uX3dlaWdodCkpCm1ldGFkYXRhX2JjJGJvbWJjYWxfRHJ5X3NhbXBsZV9tYXNzX25vcm0gPC0gcHJlZGljdChiZXN0Tm9ybWFsaXplKG1ldGFkYXRhX2JjJGJvbWJjYWxfRHJ5X3NhbXBsZV9tYXNzKSkKYGBgCmBgYHtyfQpvcHRpb25zKGNvbnRyYXN0cz1jKCJjb250ci5zdW0iLCAiY29udHIucG9seSIpKQptb2RlbF9mZWNhbF9tYXNzIDwtIGxtZXJUZXN0OjpsbWVyKGJvbWJjYWxfRHJ5X3NhbXBsZV9tYXNzX25vcm0gfiBDYXRlZ29yeSpTZXggKyBQcm9tZXRoaW9uX3dlaWdodF9ub3JtICsoQ2F0ZWdvcnl8QmF0Y2gvU2V4L1Byb21ldGhpb25fQ2FiaW5ldCksIGRhdGEgPSBtZXRhZGF0YV9iYykKbG1lclRlc3Q6OnN0ZXAobW9kZWxfZmVjYWxfbWFzcywga2VlcCA9ICJDYXRlZ29yeSIpCmBgYApgYGB7cn0Kb3B0aW9ucyhjb250cmFzdHM9YygiY29udHIuc3VtIiwgImNvbnRyLnBvbHkiKSkKbW9kZWxfZmVjYWxfbWFzcy4yIDwtIGxtZXIoYm9tYmNhbF9Ecnlfc2FtcGxlX21hc3Nfbm9ybSB+IENhdGVnb3J5ICsgUHJvbWV0aGlvbl93ZWlnaHRfbm9ybSArICgxIHwgUHJvbWV0aGlvbl9DYWJpbmV0OihTZXg6QmF0Y2gpKSwgZGF0YSA9IG1ldGFkYXRhX2JjKQpzdGF0czo6c2hhcGlyby50ZXN0KHJlc2lkdWFscyhtb2RlbF9mZWNhbF9tYXNzLjIpKQphbm92YShsbShyZXNpZHVhbHMobW9kZWxfZmVjYWxfbWFzcy4yKX5maXR0ZWQudmFsdWVzKG1vZGVsX2ZlY2FsX21hc3MuMikpKQpgYGAKYGBge3J9CnBsb3QobW9kZWxfZmVjYWxfbWFzcy4yKQpgYGAKYGBge3J9CmNhcjo6QW5vdmEobW9kZWxfZmVjYWxfbWFzcy4yLCB0ZXN0LnN0YXRpc3RpYz0iRiIsIHR5cGUgPSAiSUkiKQpgYGAKYGBge3J9Cm1vZGVsX2ZlY2FsX21hc3NfcmVzaWQgPC0gbG1lcihib21iY2FsX0RyeV9zYW1wbGVfbWFzc19ub3JtIH4gU2V4ICsgUHJvbWV0aGlvbl93ZWlnaHRfbm9ybSsgKDEgfCBQcm9tZXRoaW9uX0NhYmluZXQ6KFNleDpCYXRjaCkpLCBkYXRhID0gbWV0YWRhdGFfYmMpCgptZXRhZGF0YV9iYyRib21iY2FsX0RyeV9zYW1wbGVfbWFzc19yZXNpZCA8LSByZXNpZHVhbHMobW9kZWxfZmVjYWxfbWFzc19yZXNpZCkvc2lnbWEobW9kZWxfZmVjYWxfbWFzc19yZXNpZCkKCkZpZ1MyX2ZlY2FsX21hc3MgPC0gIG1ldGFkYXRhX2JjJT4lCiAgZ2dwbG90KGFlcyh4ID0gQ2F0ZWdvcnksIHkgPSBib21iY2FsX0RyeV9zYW1wbGVfbWFzc19yZXNpZCwgc2hhcGUgPSBTZXgsIGNvbG9yID0gQ2F0ZWdvcnkpKSArIAogIGdlb21fcXVhc2lyYW5kb20oYWxwaGEgPSAwLjcsIHNpemUgPSAwLjc1KSArCiAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaXplPTIsIGFlcyhncm91cCA9IENhdGVnb3J5KSwgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNiwgc2hhcGUgPSAxNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9DYXRlZ29yeSwgbGFiZWwgPSBjKCJLaWxsZWQtQ00iLCAiTGl2ZS1DTSIpLCBuYW1lID0gIlRyZWF0bWVudCIpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gc2hhcGVfU2V4LCBsYWJlbCA9IGMoIkZlbWFsZSIsICJNYWxlIikpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJLaWxsZWQiID0gIktpbGxlZC1cbkNNIiwgIkxpdmUiID0gIkxpdmUtXG5DTSIpKSArCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxMCkgKwogIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgbGFicyh5ID0gIkFkai4gZmVjYWwgbWFzcyIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKSAKRmlnUzJfZmVjYWxfbWFzcwpgYGAKCi0+IG5vIGRpZmZlcmVuY2UgYmV0d2VlbiB0cmVhdG1lbnQgZ3JvdXBzCgojIyMjIEJvbWIgY2Fsb3JpbWV0cnkKYGBge3J9Cm1ldGFkYXRhX2JjICU+JQogIGdncGxvdChhZXMoeD0gUHJvbWV0aGlvbl93ZWlnaHQgLHk9Ym9tYmNhbF9DYWxvcmlmaWNfVmFsdWVfa2NhbF90b3RhbF9kYXksIGNvbG9yID0gQ2F0ZWdvcnksIGdyb3VwID0gQ2F0ZWdvcnkpKSArCiAgZ2VvbV9zbW9vdGgoIG1ldGhvZCA9ICJsbSIsIHNlID0gRiwgYWxwaGEgPSAwLjgsIHNpemUgPSAwLjUsIHNob3cubGVnZW5kID0gRikrIAogIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gU2V4KSwgYWxwaGEgPTAuNywgc2l6ZSA9MC43NSwgc2hvdy5sZWdlbmQgPSBUKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1jKDE2LCA0KSwgbmFtZSA9ICJTZXgiLCBsYWJlbCA9IGMoIkZlbWFsZSIsICJNYWxlIikpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKGNvbG9yX0NhdGVnb3J5KSwgbmFtZSA9ICJUcmVhdG1lbnQiLCBsYWJlbCA9IGMoIktpbGxlZC1DTSIsICJMaXZlLUNNIikpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDEwKSArCiAgbGFicyh5ID0gIkZlY2FsIEVuZXJneSAoa2NhbC9nL2QpIiwgeCA9ICJXZWlnaHQgKGcpIikKYGBgCmBgYHtyfQpzZXQuc2VlZCg2MjgpCgptZXRhZGF0YV9iYyRib21iY2FsX0NhbG9yaWZpY19WYWx1ZV9rY2FsX3RvdGFsX2RheV9ub3JtIDwtIHByZWRpY3QoYmVzdE5vcm1hbGl6ZShtZXRhZGF0YV9iYyRib21iY2FsX0NhbG9yaWZpY19WYWx1ZV9rY2FsX3RvdGFsX2RheSkpCgpvcHRpb25zKGNvbnRyYXN0cz1jKCJjb250ci5zdW0iLCAiY29udHIucG9seSIpKQptb2RlbF9Cb21iX2NhbCA8LSBsbWVyVGVzdDo6bG1lcihib21iY2FsX0NhbG9yaWZpY19WYWx1ZV9rY2FsX3RvdGFsX2RheV9ub3JtIH4gQ2F0ZWdvcnkqU2V4ICsgUHJvbWV0aGlvbl93ZWlnaHRfbm9ybSArKENhdGVnb3J5fEJhdGNoL1NleC9Qcm9tZXRoaW9uX0NhYmluZXQpLCBkYXRhID0gbWV0YWRhdGFfYmMpCmxtZXJUZXN0OjpzdGVwKG1vZGVsX0JvbWJfY2FsLCBrZWVwID0gIkNhdGVnb3J5IikKYGBgCmBgYHtyfQpvcHRpb25zKGNvbnRyYXN0cz1jKCJjb250ci5zdW0iLCAiY29udHIucG9seSIpKQptb2RlbF9Cb21iX2NhbC4yIDwtIGxtZXIoYm9tYmNhbF9DYWxvcmlmaWNfVmFsdWVfa2NhbF90b3RhbF9kYXlfbm9ybSB+IENhdGVnb3J5ICsgUHJvbWV0aGlvbl93ZWlnaHRfbm9ybSsgKDEgfCBQcm9tZXRoaW9uX0NhYmluZXQ6KFNleDpCYXRjaCkpLCBkYXRhID0gbWV0YWRhdGFfYmMpCnN0YXRzOjpzaGFwaXJvLnRlc3QocmVzaWR1YWxzKG1vZGVsX0JvbWJfY2FsLjIpKQphbm92YShsbShyZXNpZHVhbHMobW9kZWxfQm9tYl9jYWwuMil+Zml0dGVkLnZhbHVlcyhtb2RlbF9Cb21iX2NhbC4yKSkpCmBgYApgYGB7cn0KcGxvdChtb2RlbF9Cb21iX2NhbC4yKQpgYGAKYGBge3J9Cm9wdGlvbnMoY29udHJhc3RzPWMoImNvbnRyLnN1bSIsICJjb250ci5wb2x5IikpCmNhcjo6QW5vdmEobW9kZWxfQm9tYl9jYWwuMiwgdGVzdC5zdGF0aXN0aWM9IkYiLCB0eXBlID0gIklJIikKYGBgCmBgYHtyfQptb2RlbF9Cb21iX2NhbF9yZXNpZCA8LSBsbWVyKGJvbWJjYWxfQ2Fsb3JpZmljX1ZhbHVlX2tjYWxfdG90YWxfZGF5X25vcm0gfiBTZXggKyBQcm9tZXRoaW9uX3dlaWdodF9ub3JtKyAoMSB8IFByb21ldGhpb25fQ2FiaW5ldDooU2V4OkJhdGNoKSksIGRhdGEgPSBtZXRhZGF0YV9iYykKbWV0YWRhdGFfYmMkYm9tYmNhbF9DYWxvcmlmaWNfVmFsdWVfa2NhbF90b3RhbF9kYXlfcmVzaWQgPC0gcmVzaWR1YWxzKG1vZGVsX0JvbWJfY2FsX3Jlc2lkKS9zaWdtYShtb2RlbF9Cb21iX2NhbF9yZXNpZCkKCkZpZzFfZmVjYWxfZW5lcmd5IDwtIG1ldGFkYXRhX2JjJT4lCiAgZ2dwbG90KGFlcyh4ID0gQ2F0ZWdvcnksIHkgPSBib21iY2FsX0NhbG9yaWZpY19WYWx1ZV9rY2FsX3RvdGFsX2RheV9yZXNpZCwgc2hhcGUgPSBTZXgsIGNvbG9yID0gQ2F0ZWdvcnkpKSArIAogIGdlb21fcXVhc2lyYW5kb20oYWxwaGEgPSAwLjcsIHNpemUgPSAwLjc1KSArCiAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaXplPTIsIGFlcyhncm91cCA9IENhdGVnb3J5KSwgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNiwgc2hhcGUgPSAxNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9DYXRlZ29yeSwgbGFiZWwgPSBjKCJLaWxsZWQtQ00iLCAiTGl2ZS1DTSIpLCBuYW1lID0gIlRyZWF0bWVudCIpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gc2hhcGVfU2V4LCBsYWJlbCA9IGMoIkZlbWFsZSIsICJNYWxlIikpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJLaWxsZWQiID0gIktpbGxlZC1cbkNNIiwgIkxpdmUiID0gIkxpdmUtXG5DTSIpKSArCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxMCkgKwogIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgbGFicyh5ID0gIkFkai4gZmVjYWwgZW5lcmd5IGNvbmV0bnQiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSkgCkZpZzFfZmVjYWxfZW5lcmd5CmBgYAotPiBubyBkaWZmZXJlbmNlIGJldHdlZW4gdHJlYXRtZW50IGdyb3VwcwojIyMgRmlndXJlIDEgLSBFZmZlY3RzIG9mIGxpdmUgb3IgaGVhdC1raWxsZWQgQy4gbWludXRhIGFtZW5kbWVudCB0byBmZWNhbCB0cmFuc3BsYW50cyB0byBHRiBtaWNlIG9uIEMuIG1pbnV0YSwgbXVyaW5lIGFkaXBvc2l0eSwgZmVlZCBlZmZpY2llbmN5IGFuZCBmZWNhbCBlbmVyZ3kgbG9zcyBmb3VyIHdlZWtzIHBvc3QgaW5vY3VsYXRpb24uIApgYGB7cn0KTGVnZW5kX3RyZWF0bWVudF9zZXggPC0gY293cGxvdDo6Z2V0X2xlZ2VuZChtZXRhZGF0YV9DbWluICU+JSAKICBkcGx5cjo6bXV0YXRlKFNleCA9IGlmZWxzZShTZXggPT0gIkYiLCAiRmVtYWxlIiwgIk1hbGUiKSwgCiAgICAgICAgICAgICAgICBDYXRlZ29yeSA9IGlmZWxzZShDYXRlZ29yeSA9PSAiS2lsbGVkIiwgIktpbGxlZC1DTSIsICJMaXZlLUNNIiksIAogICAgICAgICAgICAgICAgU2V4X0NhdGVnb3J5ID0gcGFzdGUoU2V4LCBDYXRlZ29yeSwgc2VwID0gIiAiKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gQ2F0ZWdvcnksIHkgPSBxUENSX0NtaW5fcGVyX2dDQywgc2hhcGUgPSBTZXhfQ2F0ZWdvcnksIGNvbG9yID0gU2V4X0NhdGVnb3J5KSkgKyAKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IFNleF9DYXRlZ29yeSwgY29sb3I9IFNleF9DYXRlZ29yeSksIGFscGhhID0wLjcsIHNpemUgPTAuNSwgc2hvdy5sZWdlbmQgPSBUKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1jKDE2LCAxNiw0LCA0KSkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoY29sb3JfQ2F0ZWdvcnksIGNvbG9yX0NhdGVnb3J5KSkgKwogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTApICsKICBndWlkZXMoc2hhcGUgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMywgYWxwaGEgPSAxKSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSkKYGBgCmBgYHtyfQpGaWcxX2FsaWduIDwtIGNvd3Bsb3Q6OmFsaWduX3Bsb3RzKEZpZzFfcVBDUl9DbWluICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlnMV9hZGlwb3NpdHkgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZzFfZm9vZGludGFrZV93ZWlnaHQgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWcxX2Zvb2RpbnRha2VfcmVzaWQgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWcxX2ZlZWRfZWZmICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZzFfZmVjYWxfZW5lcmd5ICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSAnaHYnLCBheGlzID0gJ3RibHInKQogICAgICAgICAgICAgICAgICAgICAgCkZpZzFfMSA8LSBjb3dwbG90OjpwbG90X2dyaWQoRmlnMV9hbGlnbltbMV1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZzFfYWxpZ25bWzJdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZzFfYWxpZ25bWzVdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZzFfYWxpZ25bWzZdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2w9MiwgbnJvdz0yLCBsYWJlbHMgPSBjKCJCIiwgIkMiLCAiRiIsICJHIiksbGFiZWxfc2l6ZSA9IDEyLCByZWxfd2lkdGhzID0gYygxLDEpLCByZWxfaGVpZ2h0cyA9IGMoMSwxKSkKCkZpZzFfMiA8LSBjb3dwbG90OjpwbG90X2dyaWQoRmlnMV9hbGlnbltbNF1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVnZW5kX3RyZWF0bWVudF9zZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sPTEsIG5yb3c9MiwgbGFiZWxzID0gYygiRSIsIE5BKSxsYWJlbF9zaXplID0gMTIsIHJlbF9oZWlnaHRzID0gYygxLDEpKQoKRmlnMV8zIDwtIGNvd3Bsb3Q6OnBsb3RfZ3JpZChGaWcxX2FsaWduW1szXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWcxXzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sPTIsIG5yb3c9MSwgbGFiZWxzID0gYygiRCIsIE5BKSxsYWJlbF9zaXplID0gMTIsIHJlbF93aWR0aHMgPSBjKDEsMSkpCgpGaWd1cmUxIDwtIGNvd3Bsb3Q6OnBsb3RfZ3JpZChGaWcxXzEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZzFfMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sPTIsIG5yb3cgPSAxLCByZWxfd2lkdGhzID0gYygxLDEpKQpgYGAKYGBge3IgZmlnLndpZHRoPTYuNSwgZmlnLmhlaWdodD0gNH0KRmlndXJlMQpgYGAKYGBge3IgZXZhbCA9IEZBTFNFfQpnZ3NhdmUoIi4vRmlndXJlMS5wZGYiLCBwbG90ID0gRmlndXJlMSwgZGV2aWNlID0gY2Fpcm9fcGRmLCAgCiAgd2lkdGggPSAxNywKICBoZWlnaHQgPSAxMC41LAogIHVuaXRzID0gImNtIikKYGBgCiMjIyBGaWd1cmUgUzIgLSBNdXJpbmUgYm9keSB3ZWlnaHQgZ2FpbiBhbmQgZmVjYWwgbWFzcy4KYGBge3J9CkZpZ1MyX2FsaWduIDwtIGNvd3Bsb3Q6OmFsaWduX3Bsb3RzKEZpZ1MyX3dlaWdodCArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZ1MyX2ZlY2FsX21hc3MgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiA9ICdodicsIGF4aXMgPSAndGJscicpCiAgICAgICAgICAgICAgICAgICAgICAKRmlndXJlUzIgPC0gY293cGxvdDo6cGxvdF9ncmlkKEZpZ1MyX2FsaWduW1sxXV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlnUzJfYWxpZ25bWzJdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlZ2VuZF90cmVhdG1lbnRfc2V4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbD0zLCBucm93PTEsIGxhYmVscyA9IGMoIkEiLCAiQiIsIE5BKSxsYWJlbF9zaXplID0gMTIsIHJlbF93aWR0aHMgPSBjKDEuNSwxLCAwLjc1KSkKYGBgCmBgYHtyIGZpZy53aWR0aD0gNSwgZmlnLmhlaWdodD0gMi41fQpGaWd1cmVTMgpgYGAKYGBge3IgZXZhbCA9IEZBTFNFfQpnZ3NhdmUoIi4vRmlndXJlUzIucGRmIiwgcGxvdCA9IEZpZ19zdXBwLmZlLCBkZXZpY2UgPSBjYWlyb19wZGYsICAKICB3aWR0aCA9IDEzLAogIGhlaWdodCA9IDYuNSwKICB1bml0cyA9ICJjbSIpCmBgYAoKIyMgQy4gbWludXRhIGFtZW5kZWQgbWljZSBkaXNwbGF5ZWQgaGlnaGVyIHBoeXNpY2FsIGFjdGl2aXR5IGFuZCBtZXRhYm9saWMgZW5lcmd5IGV4cGVuZGl0dXJlIGluIGEgc2V4LWRlcGVuZGVudCBtYW5uZXIKIyMjIEFjdGl2aXR5IApGb3IgdGhlIGFjdGl2aXR5IGRhdGEgdGhlIGFjY2xpbWF0aXphdGlvbiBwZXJpb2QgaXMgcmVtb3ZlZCwgYXMgYWN0aXZpdHkgaXMgaGlnaGx5IGluZmx1ZW5jZWQgYnkgc3RyZXNzCmBgYHtyfQpQcm9tZXRoaW9uX2FjdGl2aXR5X2VlIDwtIFByb21ldGhpb24uMiAlPiUgIyBjcmVhdGUgYSBjb21tb24gZGF0YXNldCB0byBjYWxjdWxhdGUgRUUgYW5kIGFjdGl2aXR5CiAgYmFzZTo6c3Vic2V0KERhdGVfY29tbW9uID49IGFzLlBPU0lYY3QoJzIwMjAtMDUtMDIgMDg6MDA6MDAnKSAmIERhdGVfY29tbW9uIDw9IGFzLlBPU0lYY3QoJzIwMjAtMDUtMDQgMDg6MDA6MDAnKSkgJT4lICMgZXhjbHVkZSBhY2NsaW1hdGl6YXRpb24gcGVyaW9kIGFuZCBlbmQgb2YgZXhwZXJpbWVudCAKICBkcGx5cjo6bXV0YXRlKFBlZFNwZWVkX01ueiA9IGlmZWxzZShQZWRTcGVlZF9NbnogPiAwLCBQZWRTcGVlZF9NbnosIE5BKSkgJT4lICMgZXhjbHVkZSBzcGVlZCB3aGVuIGFuaW1hbHMgd2hlcmUgbm90IHJ1bm5pbmcKICBkcGx5cjo6Z3JvdXBfYnkoTW91c2VJRCkgJT4lCiAgZHBseXI6OnN1bW1hcmlzZShEaXN0YW5jZV90cmF2ZWxlZCA9IHN1bShBbGxNZXRlcnNfUiksIAogICAgICAgICAgICAgICAgICAgQmVhbV9icmVha3MgPSBzdW0oWEJyZWFrX1IpICsgc3VtKFlCcmVha19SKSArIHN1bShaQnJlYWtfUiksIAogICAgICAgICAgICAgICAgICAgbWVhbl9ydW5uaW5nX3NwZWVkID0gbWVhbihQZWRTcGVlZF9NbnosIG5hLnJtPVRSVUUpLAogICAgICAgICAgICAgICAgICAgRUVfYXZlcmFnZV9wZXJfaG91ciA9IG1lYW4oa2NhbF9ocl9NKSkgJT4lCiAgZHBseXI6OnVuZ3JvdXAoKSAlPiUKICBkcGx5cjo6bGVmdF9qb2luKG1ldGFkYXRhLCBieSA9Ik1vdXNlSUQiKSAKClByb21ldGhpb25fYWN0aXZpdHkgPC0gUHJvbWV0aGlvbl9hY3Rpdml0eV9lZSAlPiUgIyBleGNsdWRlIG1pY2Ugd2l0aCBzdXNwaWNpb3VzIGFjdGl2aXR5IG1lYXN1cmVtZW50cyAKICBkcGx5cjo6Z3JvdXBfYnkoQmF0Y2gpICU+JSAKICBkcGx5cjo6bXV0YXRlKGxvd2VyX2JvdW5kX0Rpc3RhbmNlX3RyYXZlbGVkID0gbWVkaWFuKERpc3RhbmNlX3RyYXZlbGVkKSAtIDMgKiBtYWQoRGlzdGFuY2VfdHJhdmVsZWQpLAogICAgICAgICAgICAgICAgdXBwZXJfYm91bmRfRGlzdGFuY2VfdHJhdmVsZWQgPSBtZWRpYW4oRGlzdGFuY2VfdHJhdmVsZWQpICsgMyAqIG1hZChEaXN0YW5jZV90cmF2ZWxlZCksCiAgICAgICAgICAgICAgICBsb3dlcl9ib3VuZF9CZWFtX2JyZWFrcyA9IG1lZGlhbihCZWFtX2JyZWFrcykgLSAzICogbWFkKEJlYW1fYnJlYWtzKSwgCiAgICAgICAgICAgICAgICB1cHBlcl9ib3VuZF9CZWFtX2JyZWFrcyA9IG1lZGlhbihCZWFtX2JyZWFrcykgKyAzICogbWFkKEJlYW1fYnJlYWtzKSkgJT4lCiAgZHBseXI6OnVuZ3JvdXAoKSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoTW91c2VJRCkgJT4lIAogIGRwbHlyOjpmaWx0ZXIoZHBseXI6OmJldHdlZW4oRGlzdGFuY2VfdHJhdmVsZWQsIGxvd2VyX2JvdW5kX0Rpc3RhbmNlX3RyYXZlbGVkLCB1cHBlcl9ib3VuZF9EaXN0YW5jZV90cmF2ZWxlZCkgfCAKICAgICAgICAgICAgICAgIGRwbHlyOjpiZXR3ZWVuKEJlYW1fYnJlYWtzLCBsb3dlcl9ib3VuZF9CZWFtX2JyZWFrcywgdXBwZXJfYm91bmRfQmVhbV9icmVha3MpKSAlPiUKICBkcGx5cjo6dW5ncm91cCgpIApgYGAKCiMjIyBCZWFtIGJyZWFrcwpgYGB7cn0KUHJvbWV0aGlvbl9hY3Rpdml0eSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBDYXRlZ29yeSwgeSA9IEJlYW1fYnJlYWtzLCBzaGFwZSA9IFNleCwgY29sb3IgPSBDYXRlZ29yeSkpICsgCiAgZ2VvbV9xdWFzaXJhbmRvbShhbHBoYSA9IDAuNywgc2l6ZSA9IDAuNzUpICsKICBzdGF0X3N1bW1hcnkoZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNpemU9MiwgYWVzKGdyb3VwID0gQ2F0ZWdvcnkpLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC42LCBzaGFwZSA9IDE1KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX0NhdGVnb3J5LCBsYWJlbCA9IGMoIktpbGxlZC1DTSIsICJMaXZlLUNNIiksIG5hbWUgPSAiVHJlYXRtZW50IikgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBzaGFwZV9TZXgsIGxhYmVsID0gYygiRmVtYWxlIiwgIk1hbGUiKSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIktpbGxlZCIgPSAiS2lsbGVkLVxuQ00iLCAiTGl2ZSIgPSAiTGl2ZS1cbkNNIikpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDEwKSArCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICBsYWJzKHkgPSAiIyBCZWFtIGJyZWFrcyIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKSAKYGBgCmBgYHtyfQpvcHRpb25zKGNvbnRyYXN0cz1jKCJjb250ci5zdW0iLCAiY29udHIucG9seSIpKQptb2RlbF9CZWFtX2JyZWFrczwtKGxtZXIoQmVhbV9icmVha3MgfiBDYXRlZ29yeSpTZXggKyAoQ2F0ZWdvcnl8QmF0Y2gvU2V4L1Byb21ldGhpb25fQ2FiaW5ldCksIFByb21ldGhpb25fYWN0aXZpdHkpKQpzdGVwKG1vZGVsX0JlYW1fYnJlYWtzLCBrZWVwID0iQ2F0ZWdvcnkiKQpgYGAKYGBge3J9Cm9wdGlvbnMoY29udHJhc3RzPWMoImNvbnRyLnN1bSIsICJjb250ci5wb2x5IikpCm1vZGVsX0JlYW1fYnJlYWtzLjI8LShsbWVyVGVzdDo6bG1lcihCZWFtX2JyZWFrcyB+IENhdGVnb3J5ICsgU2V4ICArICgxIHwgQmF0Y2gpLCBQcm9tZXRoaW9uX2FjdGl2aXR5KSkKc3RhdHM6OnNoYXBpcm8udGVzdChyZXNpZChtb2RlbF9CZWFtX2JyZWFrcy4yKSkKYW5vdmEobG0ocmVzaWR1YWxzKG1vZGVsX0JlYW1fYnJlYWtzLjIpfmZpdHRlZC52YWx1ZXMobW9kZWxfQmVhbV9icmVha3MuMikpKQpgYGAKYGBge3J9CnBsb3QobW9kZWxfQmVhbV9icmVha3MuMikKYGBgCmBgYHtyfQpvcHRpb25zKGNvbnRyYXN0cz1jKCJjb250ci5zdW0iLCAiY29udHIucG9seSIpKQpjYXI6OkFub3ZhKG1vZGVsX0JlYW1fYnJlYWtzLjIsIHR5cGU9IklJIiwgdGVzdC5zdGF0aXN0aWM9IkYiKQpgYGAKYGBge3J9CmVmZmVjdHM6OmVmZmVjdCgiQ2F0ZWdvcnkiLCBtb2RlbF9CZWFtX2JyZWFrcy4yLCBzZSA9VFJVRSkgJT4lIGFzLmRhdGEuZnJhbWUoKQpgYGAKYGBge3J9CigxMTk2OTIuMi0xMTIwNzIuMykvMTEyMDcyLjMqMTAwCmBgYApgYGB7cn0KbW9kZWxfQmVhbV9icmVha3MucmVzaWR1YWxzIDwtKGxtZXJUZXN0OjpsbWVyKEJlYW1fYnJlYWtzIH4gU2V4ICsgKDEgfCBCYXRjaCksIFByb21ldGhpb25fYWN0aXZpdHkpKQpQcm9tZXRoaW9uX2FjdGl2aXR5JEJlYW1fYnJlYWtzX3Jlc2lkdWFscyA8LSByZXNpZHVhbHMobW9kZWxfQmVhbV9icmVha3MucmVzaWR1YWxzKS9zaWdtYShtb2RlbF9CZWFtX2JyZWFrcy5yZXNpZHVhbHMpCgpGaWcyX2JlYW1fYnJlYWtzIDwtIFByb21ldGhpb25fYWN0aXZpdHkgJT4lIAogIGdncGxvdChhZXMoeCA9IENhdGVnb3J5LCB5ID0gQmVhbV9icmVha3NfcmVzaWR1YWxzLCBzaGFwZSA9IFNleCwgY29sb3IgPSBDYXRlZ29yeSkpICsgCiAgZ2VvbV9xdWFzaXJhbmRvbShhbHBoYSA9IDAuNywgc2l6ZSA9IDAuNzUpICsKICBzdGF0X3N1bW1hcnkoZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNpemU9MiwgYWVzKGdyb3VwID0gQ2F0ZWdvcnkpLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC42LCBzaGFwZSA9IDE1KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX0NhdGVnb3J5LCBsYWJlbCA9IGMoIktpbGxlZC1DTSIsICJMaXZlLUNNIiksIG5hbWUgPSAiVHJlYXRtZW50IikgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBzaGFwZV9TZXgsIGxhYmVsID0gYygiRmVtYWxlIiwgIk1hbGUiKSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIktpbGxlZCIgPSAiS2lsbGVkLVxuQ00iLCAiTGl2ZSIgPSAiTGl2ZS1cbkNNIikpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDEwKSArCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICBsYWJzKHkgPSAiQWRqLiBiZWFtIGJyZWFrcyIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKSAKRmlnMl9iZWFtX2JyZWFrcwpgYGAKLT4gc2lnbmlmaWNhbnQgbW9yZSBiZWFtIGJyZWFrcyBieSB0cmVhdG1lbnQKCiMjIyBEaXN0YW5jZSB0cmF2ZWxlZApgYGB7cn0KUHJvbWV0aGlvbl9hY3Rpdml0eSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBDYXRlZ29yeSwgeSA9IERpc3RhbmNlX3RyYXZlbGVkLCBzaGFwZSA9IFNleCwgY29sb3IgPSBDYXRlZ29yeSkpICsgCiAgZ2VvbV9xdWFzaXJhbmRvbShhbHBoYSA9IDAuNywgc2l6ZSA9IDAuNzUpICsKICBzdGF0X3N1bW1hcnkoZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNpemU9MiwgYWVzKGdyb3VwID0gQ2F0ZWdvcnkpLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC42LCBzaGFwZSA9IDE1KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX0NhdGVnb3J5LCBsYWJlbCA9IGMoIktpbGxlZC1DTSIsICJMaXZlLUNNIiksIG5hbWUgPSAiVHJlYXRtZW50IikgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBzaGFwZV9TZXgsIGxhYmVsID0gYygiRmVtYWxlIiwgIk1hbGUiKSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIktpbGxlZCIgPSAiS2lsbGVkLVxuQ00iLCAiTGl2ZSIgPSAiTGl2ZS1cbkNNIikpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDEwKSArCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICBsYWJzKHkgPSAiRGlzdGFuY2UgdHJhdmVsZWQgKG0pIikgKwogIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKSArCiAgZmFjZXRfZ3JpZChTZXh+LikgKwogICAgIHRoZW1lKHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSkgICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKSAKYGBgCmBgYHtyfQpzZXQuc2VlZCgzMTIpIApQcm9tZXRoaW9uX2FjdGl2aXR5JERpc3RhbmNlX3RyYXZlbGVkX25vcm08LSBwcmVkaWN0KGJlc3ROb3JtYWxpemUoUHJvbWV0aGlvbl9hY3Rpdml0eSREaXN0YW5jZV90cmF2ZWxlZCkpCgptb2RlbF9EaXN0YW5jZV90cmF2ZWxlZDwtKGxtZXIoRGlzdGFuY2VfdHJhdmVsZWRfbm9ybSB+IENhdGVnb3J5KlNleCArIChDYXRlZ29yeSB8QmF0Y2gvU2V4L1Byb21ldGhpb25fQ2FiaW5ldCksIFByb21ldGhpb25fYWN0aXZpdHkpKQpsbWVyVGVzdDo6c3RlcChtb2RlbF9EaXN0YW5jZV90cmF2ZWxlZCwga2VlcCA9IkNhdGVnb3J5IikKYGBgCi0tPiBhbHRob3VnaCBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCwgZXhhY3QgYW5hbHlzaXMgb2YgZGF0YSByZXN1bHRzIGluIGFzc3VtcHRpb24gb2YgZGlmZmVyZW50IHRyZWF0bWVudCBlZmZlY3RzIGluIG1hbGVzIGFuZCBmZW1hbGVzIAotLT4gc2VwYXJhdGUgc3RhdGlzdGljYWwgYW5hbHlzaXMKCmBgYHtyfQpvcHRpb25zKGNvbnRyYXN0cz1jKCJjb250ci5zdW0iLCAiY29udHIucG9seSIpKQpQcm9tZXRoaW9uX2FjdGl2aXR5X00gPC0gUHJvbWV0aGlvbl9hY3Rpdml0eSAlPiUgZHBseXI6OmZpbHRlcihTZXggPT0iTSIpClByb21ldGhpb25fYWN0aXZpdHlfRiA8LSBQcm9tZXRoaW9uX2FjdGl2aXR5ICU+JSBkcGx5cjo6ZmlsdGVyKFNleCA9PSJGIikKCm1vZGVsX0Rpc3RhbmNlX3RyYXZlbGVkLm08LShsbWVyVGVzdDo6bG1lcihEaXN0YW5jZV90cmF2ZWxlZF9ub3JtIH4gQ2F0ZWdvcnkgKyAoMSB8IEJhdGNoKSwgUHJvbWV0aGlvbl9hY3Rpdml0eV9NKSkKc3RhdHM6OnNoYXBpcm8udGVzdChyZXNpZChtb2RlbF9EaXN0YW5jZV90cmF2ZWxlZC5tKSkKYW5vdmEobG0ocmVzaWR1YWxzKG1vZGVsX0Rpc3RhbmNlX3RyYXZlbGVkLm0pfmZpdHRlZC52YWx1ZXMobW9kZWxfRGlzdGFuY2VfdHJhdmVsZWQubSkpKQoKbW9kZWxfRGlzdGFuY2VfdHJhdmVsZWQuZjwtKGxtZXJUZXN0OjpsbWVyKERpc3RhbmNlX3RyYXZlbGVkX25vcm0gfiBDYXRlZ29yeSArICgxIHwgQmF0Y2gpLCBQcm9tZXRoaW9uX2FjdGl2aXR5X0YpKQpzdGF0czo6c2hhcGlyby50ZXN0KHJlc2lkKG1vZGVsX0Rpc3RhbmNlX3RyYXZlbGVkLmYpKQphbm92YShsbShyZXNpZHVhbHMobW9kZWxfRGlzdGFuY2VfdHJhdmVsZWQuZil+Zml0dGVkLnZhbHVlcyhtb2RlbF9EaXN0YW5jZV90cmF2ZWxlZC5mKSkpCmBgYApgYGB7cn0KY2FyOjpBbm92YShtb2RlbF9EaXN0YW5jZV90cmF2ZWxlZC5tLCB0ZXN0LnN0YXRpc3RpYyA9IkYiLCB0eXBlPSJJSSIpCmNhcjo6QW5vdmEobW9kZWxfRGlzdGFuY2VfdHJhdmVsZWQuZiwgdGVzdC5zdGF0aXN0aWMgPSJGIiwgdHlwZT0iSUkiKQoKbW9kZWxfRGlzdGFuY2VfdHJhdmVsZWQubWVmZjwtKGxtZXJUZXN0OjpsbWVyKERpc3RhbmNlX3RyYXZlbGVkIH4gQ2F0ZWdvcnkgKyAoMSB8IEJhdGNoKSwgUHJvbWV0aGlvbl9hY3Rpdml0eV9NKSkKZWZmZWN0czo6ZWZmZWN0KCJDYXRlZ29yeSIsIG1vZGVsX0Rpc3RhbmNlX3RyYXZlbGVkLm1lZmYsIHNlID1UUlVFKSAlPiUgYXMuZGF0YS5mcmFtZQoKbW9kZWxfRGlzdGFuY2VfdHJhdmVsZWQuZmVmZjwtKGxtZXJUZXN0OjpsbWVyKERpc3RhbmNlX3RyYXZlbGVkIH4gQ2F0ZWdvcnkgKyAoMSB8IEJhdGNoKSwgUHJvbWV0aGlvbl9hY3Rpdml0eV9GKSkKZWZmZWN0czo6ZWZmZWN0KCJDYXRlZ29yeSIsIG1vZGVsX0Rpc3RhbmNlX3RyYXZlbGVkLmZlZmYsIHNlID1UUlVFKSAlPiUgYXMuZGF0YS5mcmFtZQpgYGAKYGBge3J9Cm1vZGVsX0Rpc3RhbmNlX3RyYXZlbGVkLm1fcmVzaWR1YWxzIDwtKGxtZXJUZXN0OjpsbWVyKERpc3RhbmNlX3RyYXZlbGVkX25vcm0gfiAoMSB8IEJhdGNoKSwgUHJvbWV0aGlvbl9hY3Rpdml0eV9NKSkKbW9kZWxfRGlzdGFuY2VfdHJhdmVsZWQuZl9yZXNpZHVhbHMgPC0obG1lclRlc3Q6OmxtZXIoRGlzdGFuY2VfdHJhdmVsZWRfbm9ybSB+ICgxIHwgQmF0Y2gpLCBQcm9tZXRoaW9uX2FjdGl2aXR5X0YpKQoKUHJvbWV0aGlvbl9hY3Rpdml0eV9NJERpc3RhbmNlX3RyYXZlbGVkX3Jlc2lkdWFscyA8LSByZXNpZHVhbHMobW9kZWxfRGlzdGFuY2VfdHJhdmVsZWQubV9yZXNpZHVhbHMpL3NpZ21hKG1vZGVsX0Rpc3RhbmNlX3RyYXZlbGVkLm1fcmVzaWR1YWxzKQpQcm9tZXRoaW9uX2FjdGl2aXR5X0YkRGlzdGFuY2VfdHJhdmVsZWRfcmVzaWR1YWxzIDwtIHJlc2lkdWFscyhtb2RlbF9EaXN0YW5jZV90cmF2ZWxlZC5mX3Jlc2lkdWFscykvc2lnbWEobW9kZWxfRGlzdGFuY2VfdHJhdmVsZWQuZl9yZXNpZHVhbHMpCgpQcm9tZXRoaW9uX2FjdGl2aXR5X01GPC0gcmJpbmQoUHJvbWV0aGlvbl9hY3Rpdml0eV9NLCBQcm9tZXRoaW9uX2FjdGl2aXR5X0YpIAoKRmlnMl9kaXN0YW5jZSA8LSBQcm9tZXRoaW9uX2FjdGl2aXR5X01GJT4lIAogIGdncGxvdChhZXMoeCA9IENhdGVnb3J5LCB5ID0gRGlzdGFuY2VfdHJhdmVsZWRfcmVzaWR1YWxzLCBzaGFwZSA9IFNleCwgY29sb3IgPSBDYXRlZ29yeSkpICsgCiAgZ2VvbV9xdWFzaXJhbmRvbShhbHBoYSA9IDAuNywgc2l6ZSA9IDAuNzUpICsKICBzdGF0X3N1bW1hcnkoZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNpemU9MiwgYWVzKGdyb3VwID0gQ2F0ZWdvcnkpLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC42LCBzaGFwZSA9IDE1KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX0NhdGVnb3J5LCBsYWJlbCA9IGMoIktpbGxlZC1DTSIsICJMaXZlLUNNIiksIG5hbWUgPSAiVHJlYXRtZW50IikgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBzaGFwZV9TZXgsIGxhYmVsID0gYygiRmVtYWxlIiwgIk1hbGUiKSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIktpbGxlZCIgPSAiS2lsbGVkLVxuQ00iLCAiTGl2ZSIgPSAiTGl2ZS1cbkNNIikpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDEwKSArCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICBsYWJzKHkgPSAiQWRqLiBkaXN0YW5jZSB0cmF2ZWxlZCIsIHg9ICJUcmVhdG1lbnQiKSArCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpICsKICBmYWNldF9ncmlkKFNleH4uKSArCiAgICAgdGhlbWUoc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF9ibGFuaygpKSAgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpCkZpZzJfZGlzdGFuY2UKYGBgCiMjIyBNZWFuIHJ1bm5pbmcgc3BlZWQKYGBge3J9CkZpZ1MzX3NwZWVkIDwtIFByb21ldGhpb25fYWN0aXZpdHkgJT4lIAogIGdncGxvdChhZXMoeCA9IENhdGVnb3J5LCB5ID0gbWVhbl9ydW5uaW5nX3NwZWVkLCBzaGFwZSA9IFNleCwgY29sb3IgPSBDYXRlZ29yeSkpICsgCiAgZ2VvbV9xdWFzaXJhbmRvbShhbHBoYSA9IDAuNywgc2l6ZSA9IDAuNzUpICsKICBzdGF0X3N1bW1hcnkoZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNpemU9MiwgYWVzKGdyb3VwID0gQ2F0ZWdvcnkpLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC42LCBzaGFwZSA9IDE1KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX0NhdGVnb3J5LCBsYWJlbCA9IGMoIktpbGxlZC1DTSIsICJMaXZlLUNNIiksIG5hbWUgPSAiVHJlYXRtZW50IikgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBzaGFwZV9TZXgsIGxhYmVsID0gYygiRmVtYWxlIiwgIk1hbGUiKSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIktpbGxlZCIgPSAiS2lsbGVkLVxuQ00iLCAiTGl2ZSIgPSAiTGl2ZS1cbkNNIikpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDEwKSArCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICBsYWJzKHkgPSJNZWFuIHJ1bm5pbmcgc3BlZWQgKG0vcykiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSkgCkZpZ1MzX3NwZWVkCmBgYApgYGB7cn0Kc2V0LnNlZWQoODc0KQoKUHJvbWV0aGlvbl9hY3Rpdml0eSA8LSBQcm9tZXRoaW9uX2FjdGl2aXR5ICU+JQogIGRwbHlyOjptdXRhdGUobWVhbl9ydW5uaW5nX3NwZWVkX25vcm0gPSBwcmVkaWN0KGJlc3ROb3JtYWxpemUobWVhbl9ydW5uaW5nX3NwZWVkKSkpCgoKbW9kZWxfc3BlZWQgPC0gbG1lcihtZWFuX3J1bm5pbmdfc3BlZWRfbm9ybSB+IENhdGVnb3J5KlNleCArIFByb21ldGhpb25fQ2FiaW5ldCArICgxfEJhdGNoKSwgZGF0YSA9IFByb21ldGhpb25fYWN0aXZpdHkpCnN0ZXAobW9kZWxfc3BlZWQpCmBgYApgYGB7cn0KbW9kZWxfc3BlZWQuMiA8LSBsbWVyKG1lYW5fcnVubmluZ19zcGVlZF9ub3JtIH4gQ2F0ZWdvcnkgKyBTZXggKyAoMXxCYXRjaCksIGRhdGEgPSBQcm9tZXRoaW9uX2FjdGl2aXR5KQpzaGFwaXJvLnRlc3QocmVzaWR1YWxzKG1vZGVsX3NwZWVkLjIpKQphbm92YShsbShyZXNpZHVhbHMobW9kZWxfc3BlZWQuMil+Zml0dGVkLnZhbHVlcyhtb2RlbF9zcGVlZC4yKSkpCmBgYApgYGB7cn0KcGxvdChtb2RlbF9zcGVlZC4yKQpgYGAKYGBge3J9CmNhcjo6QW5vdmEobW9kZWxfc3BlZWQuMiwgdGVzdC5zdGF0aXN0aWMgPSJGIiwgdHlwZSA9IklJIikKYGBgCmBgYHtyfQptb2RlbF9zcGVlZC5lZmYgPC0gbG1lcihtZWFuX3J1bm5pbmdfc3BlZWQgfiBDYXRlZ29yeSArIFNleCArICgxfEJhdGNoKSwgZGF0YSA9IFByb21ldGhpb25fYWN0aXZpdHkpCmVmZmVjdHM6OmVmZmVjdCgiQ2F0ZWdvcnkiLCBtb2RlbF9zcGVlZC5lZmYsIHNlID1UUlVFKSAlPiUgYXMuZGF0YS5mcmFtZSgpCmBgYAojIyMgY29ycmVsYXRpb24gb2YgYWN0aXZpdHkgdG8gQy4gbWludXRhIGFidW5kYW5jZQpgYGB7cn0KUHJvbWV0aGlvbl9hY3Rpdml0eV9NRl9DbWluPC0gUHJvbWV0aGlvbl9hY3Rpdml0eV9NRiAlPiUgCiAgZHBseXI6OmxlZnRfam9pbihxUENSX2RhdGEsIGJ5ID0iTW91c2VJRCIpCgpQcm9tZXRoaW9uX2FjdGl2aXR5X01GX0NtaW4gJT4lCiAgZ2dwbG90KGFlcyh4PSBxUENSX0NtaW5fcGVyX2dDQyAseT1CZWFtX2JyZWFrc19yZXNpZHVhbHMpKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGLCAgYWxwaGEgPSAwLjgsIHNpemUgPSAwLjUsIGNvbG9yID0gImJsYWNrIikrIAogIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gU2V4LCBjb2xvciA9IENhdGVnb3J5KSwgYWxwaGEgPTAuNywgc2l6ZSA9MC43NSwgc2hvdy5sZWdlbmQgPSBUKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1zaGFwZV9TZXgsIGxhYmVsID0gYygiRmVtYWxlIiwgIk1hbGUiKSxuYW1lID0gIlNleCIpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jb2xvcl9DYXRlZ29yeSwgbGFiZWwgPSBjKGV4cHJlc3Npb24oaXRhbGljKCJLaWxsZWQtQ00iKSksIGV4cHJlc3Npb24oaXRhbGljKCJMaXZlLUNNIikpKSwgbmFtZSA9ICJUcmVhdG1lbnQiKSArCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxMCkgKwogIGxhYnMoeT0gIkFkai4gYmVhbSBicmVha3MiLAogICAgICAgeCA9ICJOb3JtLiBDLiBtaW51dGEiKSAKCgpQcm9tZXRoaW9uX2FjdGl2aXR5X01GX0NtaW4gJT4lCiAgZ2dwbG90KGFlcyh4PSBxUENSX0NtaW5fcGVyX2dDQyAseT1EaXN0YW5jZV90cmF2ZWxlZF9yZXNpZHVhbHMpKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGLCAgYWxwaGEgPSAwLjgsIHNpemUgPSAwLjUsIGNvbG9yID0gImJsYWNrIikrIAogIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gU2V4LCBjb2xvciA9IENhdGVnb3J5KSwgYWxwaGEgPTAuNywgc2l6ZSA9MC43NSwgc2hvdy5sZWdlbmQgPSBUKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1zaGFwZV9TZXgsIGxhYmVsID0gYygiRmVtYWxlIiwgIk1hbGUiKSxuYW1lID0gIlNleCIpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jb2xvcl9DYXRlZ29yeSwgbGFiZWwgPSBjKGV4cHJlc3Npb24oaXRhbGljKCJLaWxsZWQtQ00iKSksIGV4cHJlc3Npb24oaXRhbGljKCJMaXZlLUNNIikpKSwgbmFtZSA9ICJUcmVhdG1lbnQiKSArCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxMCkgKwogIGxhYnMoeT0gIkFkai4gZGlzdGFuY2UgdHJhdmVsZWQiLCAKICAgICAgIHggPSAiTm9ybS4gQy4gbWludXRhIikgKwogICB0aGVtZShzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X2JsYW5rKCkpICsKICBmYWNldF93cmFwKC5+U2V4LCBzY2FsZXMgPSAiZnJlZSIsIG5jb2wgPTEpIApgYGAKYGBge3J9CnNldC5zZWVkKDcxMCkKClByb21ldGhpb25fYWN0aXZpdHlfTUZfQ21pbi4yIDwtIFByb21ldGhpb25fYWN0aXZpdHlfTUZfQ21pbiAlPiUKICB0aWR5cjo6ZHJvcF9uYShxUENSX0NtaW5fcGVyX2dDQykgJT4lCiAgZHBseXI6Om11dGF0ZShxUENSX0NtaW5fcGVyX2dDQ19ub3JtID0gcHJlZGljdChiZXN0Tm9ybWFsaXplKHFQQ1JfQ21pbl9wZXJfZ0NDKSkpCgptb2RlbF9iYl9jbWluPC0obG1lcihCZWFtX2JyZWFrcyB+IHFQQ1JfQ21pbl9wZXJfZ0NDX25vcm0qU2V4ICsgcVBDUl9Sb3VuZCArICgxIHxCYXRjaC9TZXgvUHJvbWV0aGlvbl9DYWJpbmV0KSArICgxIHxCYXRjaDpQcm9tZXRoaW9uX0NhYmluZXQpICsgKDEgfFByb21ldGhpb25fQ2FiaW5ldCksIFByb21ldGhpb25fYWN0aXZpdHlfTUZfQ21pbi4yKSkKbG1lclRlc3Q6OnN0ZXAobW9kZWxfYmJfY21pbikKCm1vZGVsX2Rpc3RhbmNlX2NtaW48LShsbWVyKERpc3RhbmNlX3RyYXZlbGVkIH4gcVBDUl9DbWluX3Blcl9nQ0Nfbm9ybSpTZXggKyBxUENSX1JvdW5kICsgKDEgfEJhdGNoL1NleC9Qcm9tZXRoaW9uX0NhYmluZXQpICsgKDEgfEJhdGNoOlByb21ldGhpb25fQ2FiaW5ldCkgKyAoMSB8UHJvbWV0aGlvbl9DYWJpbmV0KSwgUHJvbWV0aGlvbl9hY3Rpdml0eV9NRl9DbWluLjIpKQpsbWVyVGVzdDo6c3RlcChtb2RlbF9kaXN0YW5jZV9jbWluKQpgYGAKLT4gYXNzb2NpYXRpb24gYmV0d2VlbiBiZWFtIGJyZWFrcyBhbmQgQy4gbWludXRhIGZvciBib3RoIHNleGVzCi0+IGZvciBkaXN0YW5jZSB0cmF2ZWxlZCB0aGVyZSBtaWdodCBiZSBvbmx5IGFuIGFzc29jaWF0aW9uIGluIG1hbGVzIC0tPiBzZXBhcmF0ZSBhbmFseXNpcwojIyMjIEJlYW0gYnJlYWtzIH4gQy4gbWludXRhIApgYGB7cn0KbW9kZWxfYmJfY21pbi4yPC0obG1lcihCZWFtX2JyZWFrcyB+IHFQQ1JfQ21pbl9wZXJfZ0NDX25vcm0gKyBTZXggKyAoMSB8IEJhdGNoKSwgUHJvbWV0aGlvbl9hY3Rpdml0eV9NRl9DbWluLjIpKQpzaGFwaXJvLnRlc3QocmVzaWR1YWxzKG1vZGVsX2JiX2NtaW4uMikpCmFub3ZhKGxtKHJlc2lkdWFscyhtb2RlbF9iYl9jbWluLjIpfmZpdHRlZC52YWx1ZXMobW9kZWxfYmJfY21pbi4yKSkpCmBgYApgYGB7cn0KY2FyOjpBbm92YShtb2RlbF9iYl9jbWluLjIsIHR5cGUgPSJJSSIsIHRlc3Quc3RhdGlzdGljPSJGIikKYGBgCmBgYHtyfQpzZXQuc2VlZCg3NjUpCnIyX21vZGVsX2JiX2NtaW5fbWFyPC0gcGFydFIyKG1vZGVsX2JiX2NtaW4uMiwgcGFydHZhcnMgPSBjKCJxUENSX0NtaW5fcGVyX2dDQ19ub3JtIiksIAogICAgICAgICAgICAgICAgICBSMl90eXBlID0gIm1hcmdpbmFsIiwgbmJvb3QgPSAxMCkKcjJfbW9kZWxfYmJfY21pbl9tYXIkUjIgJT4lIGRwbHlyOjpmaWx0ZXIodGVybSA9PSAicVBDUl9DbWluX3Blcl9nQ0Nfbm9ybSIpICU+JSBkcGx5cjo6c2VsZWN0KGVzdGltYXRlKSAlPiUgcHVsbCgpCgptb2RlbF9iYl9jbWluLnJlc2lkPC0obG1lcihCZWFtX2JyZWFrcyB+IFNleCArICgxIHwgQmF0Y2gpLCBQcm9tZXRoaW9uX2FjdGl2aXR5X01GX0NtaW4uMikpCgpQcm9tZXRoaW9uX2FjdGl2aXR5X01GX0NtaW4uMiA8LSBQcm9tZXRoaW9uX2FjdGl2aXR5X01GX0NtaW4uMiAlPiUgCiAgZHBseXI6Om11dGF0ZShCZWFtX2JyZWFrc19jbWluX3Jlc2lkID0gcmVzaWR1YWxzKG1vZGVsX2JiX2NtaW4ucmVzaWQpL3NpZ21hKG1vZGVsX2JiX2NtaW4ucmVzaWQpKQoKRmlnMl9iYl9jbWluIDwtIFByb21ldGhpb25fYWN0aXZpdHlfTUZfQ21pbi4yICU+JQogIGdncGxvdChhZXMoeD0gcVBDUl9DbWluX3Blcl9nQ0Nfbm9ybSAseT1CZWFtX2JyZWFrc19jbWluX3Jlc2lkKSkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRiwgIGFscGhhID0gMC44LCBzaXplID0gMC41LCBjb2xvciA9ICJibGFjayIpKyAKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IFNleCwgY29sb3IgPSBDYXRlZ29yeSksIGFscGhhID0wLjcsIHNpemUgPTAuNzUsIHNob3cubGVnZW5kID0gVCkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXM9c2hhcGVfU2V4LCBsYWJlbCA9IGMoIkZlbWFsZSIsICJNYWxlIiksbmFtZSA9ICJTZXgiKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9Y29sb3JfQ2F0ZWdvcnksIGxhYmVsID0gYyhleHByZXNzaW9uKGl0YWxpYygiS2lsbGVkLUNNIikpLCBleHByZXNzaW9uKGl0YWxpYygiTGl2ZS1DTSIpKSksIG5hbWUgPSAiVHJlYXRtZW50IikgKwogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTApICsKICBsYWJzKHk9ICJBZGouIGJlYW0gYnJlYWtzIiwKICAgICAgIHggPSAiTm9ybS4gQy4gbWludXRhIikKRmlnMl9iYl9jbWluCmBgYAojIyMjIERpc3RhbmNlIHRyYXZlbGVkIH4gQy4gbWludXRhIApgYGB7cn0KUHJvbWV0aGlvbl9hY3Rpdml0eV9NMiA8LSBQcm9tZXRoaW9uX2FjdGl2aXR5X01GX0NtaW4uMiAlPiUKICBkcGx5cjo6ZmlsdGVyKFNleCA9PSJNIikgJT4lCiAgZHBseXI6Om11dGF0ZSggQmF0Y2hfUHJvbWV0aGlvbl9DYWJpbmV0ID0gcGFzdGUoIEJhdGNoLCBQcm9tZXRoaW9uX0NhYmluZXQsIHNlcCA9Il8iKSkKUHJvbWV0aGlvbl9hY3Rpdml0eV9GMiA8LSBQcm9tZXRoaW9uX2FjdGl2aXR5X01GX0NtaW4uMiAlPiUKICBkcGx5cjo6ZmlsdGVyKFNleCA9PSJGIiklPiUKICBkcGx5cjo6bXV0YXRlKCBCYXRjaF9Qcm9tZXRoaW9uX0NhYmluZXQgPSBwYXN0ZSggQmF0Y2gsIFByb21ldGhpb25fQ2FiaW5ldCwgc2VwID0iXyIpKQoKbW9kZWxfZGlzdGFuY2VfY21pbl9tPC0gbG1lcihEaXN0YW5jZV90cmF2ZWxlZF9ub3JtIH4gcVBDUl9DbWluX3Blcl9nQ0Nfbm9ybSArICgxIHwgQmF0Y2hfUHJvbWV0aGlvbl9DYWJpbmV0KSwgUHJvbWV0aGlvbl9hY3Rpdml0eV9NMikKbW9kZWxfZGlzdGFuY2VfY21pbl9mPC0gbG1lcihEaXN0YW5jZV90cmF2ZWxlZF9ub3JtIH4gcVBDUl9DbWluX3Blcl9nQ0Nfbm9ybSArICgxIHwgQmF0Y2hfUHJvbWV0aGlvbl9DYWJpbmV0KSwgUHJvbWV0aGlvbl9hY3Rpdml0eV9GMikKCnNoYXBpcm8udGVzdChyZXNpZHVhbHMobW9kZWxfZGlzdGFuY2VfY21pbl9tKSkKYW5vdmEobG0ocmVzaWR1YWxzKG1vZGVsX2Rpc3RhbmNlX2NtaW5fbSl+Zml0dGVkLnZhbHVlcyhtb2RlbF9kaXN0YW5jZV9jbWluX20pKSkKCnNoYXBpcm8udGVzdChyZXNpZHVhbHMobW9kZWxfZGlzdGFuY2VfY21pbl9mKSkKYW5vdmEobG0ocmVzaWR1YWxzKG1vZGVsX2Rpc3RhbmNlX2NtaW5fZil+Zml0dGVkLnZhbHVlcyhtb2RlbF9kaXN0YW5jZV9jbWluX2YpKSkKYGBgCmBgYHtyfQpwbG90KG1vZGVsX2Rpc3RhbmNlX2NtaW5fbSkKcGxvdChtb2RlbF9kaXN0YW5jZV9jbWluX2YpCmBgYApgYGB7cn0KY2FyOjpBbm92YShtb2RlbF9kaXN0YW5jZV9jbWluX20sIHRlc3Quc3RhdGlzdGljID0iRiIpCmNhcjo6QW5vdmEobW9kZWxfZGlzdGFuY2VfY21pbl9mLCB0ZXN0LnN0YXRpc3RpYyA9IkYiKQpgYGAKCmBgYHtyfQojcjIgbWFsZXMKcjJfbW9kZWxfZGlzdGFuY2VfY21pbl9tX21hcjwtIHBhcnRSMihtb2RlbF9kaXN0YW5jZV9jbWluX20sIHBhcnR2YXJzID0gYygicVBDUl9DbWluX3Blcl9nQ0Nfbm9ybSIpLCAKICAgICAgICAgICAgICAgICAgUjJfdHlwZSA9ICJtYXJnaW5hbCIsIG5ib290ID0gMTApCnIyX21vZGVsX2Rpc3RhbmNlX2NtaW5fbV9tYXIkUjIgJT4lIGRwbHlyOjpmaWx0ZXIodGVybSA9PSAicVBDUl9DbWluX3Blcl9nQ0Nfbm9ybSIpICU+JSBkcGx5cjo6c2VsZWN0KGVzdGltYXRlKSAlPiUgcHVsbCgpCiNyMiBmZW1hbGVzCnIyX21vZGVsX2Rpc3RhbmNlX2NtaW5fZl9tYXI8LSBwYXJ0UjIobW9kZWxfZGlzdGFuY2VfY21pbl9mLCBwYXJ0dmFycyA9IGMoInFQQ1JfQ21pbl9wZXJfZ0NDX25vcm0iKSwgCiAgICAgICAgICAgICAgICAgIFIyX3R5cGUgPSAibWFyZ2luYWwiLCBuYm9vdCA9IDEwKQpyMl9tb2RlbF9kaXN0YW5jZV9jbWluX2ZfbWFyJFIyICU+JSBkcGx5cjo6ZmlsdGVyKHRlcm0gPT0gInFQQ1JfQ21pbl9wZXJfZ0NDX25vcm0iKSAlPiUgZHBseXI6OnNlbGVjdChlc3RpbWF0ZSkgJT4lIHB1bGwoKQoKbW9kZWxfZGlzdGFuY2VfY21pbi5yZXNpZF9NPC0obG1lcihEaXN0YW5jZV90cmF2ZWxlZF9ub3JtIH4gKyAoMSB8IEJhdGNoOlByb21ldGhpb25fQ2FiaW5ldCksIFByb21ldGhpb25fYWN0aXZpdHlfTTIpKQptb2RlbF9kaXN0YW5jZV9jbWluLnJlc2lkX0Y8LShsbWVyKERpc3RhbmNlX3RyYXZlbGVkX25vcm0gfiArICgxIHwgQmF0Y2g6UHJvbWV0aGlvbl9DYWJpbmV0KSwgUHJvbWV0aGlvbl9hY3Rpdml0eV9GMikpCgpQcm9tZXRoaW9uX2FjdGl2aXR5X00yIDwtIFByb21ldGhpb25fYWN0aXZpdHlfTTIgJT4lIAogIGRwbHlyOjptdXRhdGUoRGlzdGFuY2VfdHJhdmVsZWRfY21pbl9yZXNpZCA9IHJlc2lkdWFscyhtb2RlbF9kaXN0YW5jZV9jbWluLnJlc2lkX00pL3NpZ21hKG1vZGVsX2Rpc3RhbmNlX2NtaW4ucmVzaWRfTSkpClByb21ldGhpb25fYWN0aXZpdHlfRjIgPC0gUHJvbWV0aGlvbl9hY3Rpdml0eV9GMiAlPiUgCiAgZHBseXI6Om11dGF0ZShEaXN0YW5jZV90cmF2ZWxlZF9jbWluX3Jlc2lkID0gcmVzaWR1YWxzKG1vZGVsX2Rpc3RhbmNlX2NtaW4ucmVzaWRfRikvc2lnbWEobW9kZWxfZGlzdGFuY2VfY21pbi5yZXNpZF9GKSkKClByb21ldGhpb25fYWN0aXZpdHlfTUYzIDwtIHJiaW5kKFByb21ldGhpb25fYWN0aXZpdHlfTTIsIFByb21ldGhpb25fYWN0aXZpdHlfRjIpCgoKRmlnMl9kaXN0YW5jZV9jbWluPC0gUHJvbWV0aGlvbl9hY3Rpdml0eV9NRjMgJT4lCiAgZ2dwbG90KGFlcyh4PSBxUENSX0NtaW5fcGVyX2dDQ19ub3JtICx5PURpc3RhbmNlX3RyYXZlbGVkX2NtaW5fcmVzaWQpKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGLCAgYWxwaGEgPSAwLjgsIHNpemUgPSAwLjUsIGNvbG9yID0gImJsYWNrIikrIAogIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gU2V4LCBjb2xvciA9IENhdGVnb3J5KSwgYWxwaGEgPTAuNywgc2l6ZSA9MC43NSwgc2hvdy5sZWdlbmQgPSBUKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1zaGFwZV9TZXgsIGxhYmVsID0gYygiRmVtYWxlIiwgIk1hbGUiKSxuYW1lID0gIlNleCIpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jb2xvcl9DYXRlZ29yeSwgbGFiZWwgPSBjKGV4cHJlc3Npb24oaXRhbGljKCJLaWxsZWQtQ00iKSksIGV4cHJlc3Npb24oaXRhbGljKCJMaXZlLUNNIikpKSwgbmFtZSA9ICJUcmVhdG1lbnQiKSArCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxMCkgKwogIGxhYnMoeT0gIkFkai4gZGlzdGFuY2UgdHJhdmVsZWQiLCAKICAgICAgIHggPSAiTm9ybS4gQy4gbWludXRhIikgKwogICB0aGVtZShzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X2JsYW5rKCkpICsKICBmYWNldF93cmFwKC5+U2V4LCBzY2FsZXMgPSAiZnJlZSIsIG5jb2wgPTEpIApGaWcyX2Rpc3RhbmNlX2NtaW4KYGBgCiMjIyBDb3JyZWxhdGUgYWN0aXZpdHkgdG8gZmVlZCBlZmZpY2llbmN5IApgYGB7cn0KUHJvbWV0aGlvbl9hY3Rpdml0eV9mb29kIDwtIFByb21ldGhpb25fRm9vZCAlPiUKICBkcGx5cjo6c2VsZWN0KE1vdXNlSUQsIEZlZWRfZWZpY2llbmN5KSAlPiUKICBkcGx5cjo6bGVmdF9qb2luKFByb21ldGhpb25fYWN0aXZpdHksIGJ5ID0gIk1vdXNlSUQiKSAlPiUKICB0aWR5cjo6ZHJvcF9uYShGZWVkX2VmaWNpZW5jeSwgQmVhbV9icmVha3MpCgpQcm9tZXRoaW9uX2FjdGl2aXR5X2Zvb2QgJT4lCiAgZ2dwbG90KGFlcyh4PSBCZWFtX2JyZWFrcyAseT1GZWVkX2VmaWNpZW5jeSkpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEYsIGFscGhhID0gMC44LCBzaXplID0gMC41KSsgCiAgZ2VvbV9wb2ludChhZXMoc2hhcGUgPSBTZXgsIGNvbG9yID0gQ2F0ZWdvcnkpLCBhbHBoYSA9MC43LCBzaXplID0wLjUsIHNob3cubGVnZW5kID0gVCkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXM9c2hhcGVfU2V4LCBsYWJlbCA9IGMoIkZlbWFsZSIsICJNYWxlIiksbmFtZSA9ICJTZXgiKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9Y29sb3JfQ2F0ZWdvcnksIGxhYmVsID0gYyhleHByZXNzaW9uKGl0YWxpYygiS2lsbGVkLUNNIikpLCBleHByZXNzaW9uKGl0YWxpYygiTGl2ZS1DTSIpKSksIG5hbWUgPSAiVHJlYXRtZW50IikgKwogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTApIAoKUHJvbWV0aGlvbl9hY3Rpdml0eV9mb29kICU+JQogIGdncGxvdChhZXMoeD0gRGlzdGFuY2VfdHJhdmVsZWQgLHk9RmVlZF9lZmljaWVuY3kpKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGLCBhbHBoYSA9IDAuOCwgc2l6ZSA9IDAuNSkrIAogIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gU2V4LCBjb2xvciA9IENhdGVnb3J5KSwgYWxwaGEgPTAuNywgc2l6ZSA9MC41LCBzaG93LmxlZ2VuZCA9IFQpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzPXNoYXBlX1NleCwgbGFiZWwgPSBjKCJGZW1hbGUiLCAiTWFsZSIpLG5hbWUgPSAiU2V4IikgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWNvbG9yX0NhdGVnb3J5LCBsYWJlbCA9IGMoZXhwcmVzc2lvbihpdGFsaWMoIktpbGxlZC1DTSIpKSwgZXhwcmVzc2lvbihpdGFsaWMoIkxpdmUtQ00iKSkpLCBuYW1lID0gIlRyZWF0bWVudCIpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDEwKSArCiAgZmFjZXRfZ3JpZCguflNleCkKYGBgCmBgYHtyfQpvcHRpb25zKGNvbnRyYXN0cz1jKCJjb250ci5zdW0iLCAiY29udHIucG9seSIpKQoKbW9kZWxfZmVfYmIgPC0gbG1lcihGZWVkX2VmaWNpZW5jeX4gQmVhbV9icmVha3MqU2V4ICsgKDF8QmF0Y2gpLCBQcm9tZXRoaW9uX2FjdGl2aXR5X2Zvb2QpCnN0ZXAobW9kZWxfZmVfYmIpCgptb2RlbF9mZV9kaXN0YW5jZSA8LSBsbWVyKEZlZWRfZWZpY2llbmN5fiBEaXN0YW5jZV90cmF2ZWxlZCpTZXggKyAoMXxCYXRjaCksIFByb21ldGhpb25fYWN0aXZpdHlfZm9vZCkKc3RlcChtb2RlbF9mZV9kaXN0YW5jZSkKYGBgCmBgYHtyfQpzZXQuc2VlZCg2NzMpClByb21ldGhpb25fYWN0aXZpdHlfZm9vZCRGZWVkX2VmaWNpZW5jeV9ub3JtIDwtIHByZWRpY3QoYmVzdE5vcm1hbGl6ZShQcm9tZXRoaW9uX2FjdGl2aXR5X2Zvb2QkRmVlZF9lZmljaWVuY3kpKQoKbW9kZWxfZmVfYmIuMiA8LSBsbWVyKEZlZWRfZWZpY2llbmN5X25vcm1+IEJlYW1fYnJlYWtzICsgKDF8QmF0Y2gpLCBQcm9tZXRoaW9uX2FjdGl2aXR5X2Zvb2QpCnNoYXBpcm8udGVzdChyZXNpZHVhbHMobW9kZWxfZmVfYmIuMikpCmFub3ZhKGxtKHJlc2lkdWFscyhtb2RlbF9mZV9iYi4yKX5maXR0ZWQudmFsdWVzKG1vZGVsX2ZlX2JiLjIpKSkKYGBgCmBgYHtyfQpvcHRpb25zKGNvbnRyYXN0cz1jKCJjb250ci5zdW0iLCAiY29udHIucG9seSIpKQpjYXI6OkFub3ZhKG1vZGVsX2ZlX2JiLjIsIHR5cGUgPSJJSSIsIHRlc3Quc3RhdGlzdGljID0iRiIpCmBgYAoKYGBge3J9CnIyX21vZGVsX2ZlX2JiX21hcjwtIHBhcnRSMihtb2RlbF9mZV9iYi4yLCBwYXJ0dmFycyA9IGMoIkJlYW1fYnJlYWtzIiksIAogICAgICAgICAgICAgICAgICBSMl90eXBlID0gIm1hcmdpbmFsIiwgbmJvb3QgPSAxMCkKcjJfbW9kZWxfZmVfYmJfbWFyJFIyICU+JSBkcGx5cjo6ZmlsdGVyKHRlcm0gPT0gIkJlYW1fYnJlYWtzIikgJT4lIGRwbHlyOjpzZWxlY3QoZXN0aW1hdGUpICU+JSBwdWxsKCkKCgptb2RlbF9mZV9iYl9yZXNpZCA8LSBsbWVyKEZlZWRfZWZpY2llbmN5X25vcm1+ICgxfEJhdGNoKSwgUHJvbWV0aGlvbl9hY3Rpdml0eV9mb29kKQoKUHJvbWV0aGlvbl9hY3Rpdml0eV9mb29kIDwtIFByb21ldGhpb25fYWN0aXZpdHlfZm9vZCAlPiUKICBkcGx5cjo6bXV0YXRlKEZlZWRfZWZpY2llbmN5X2JiX3Jlc2lkID0gcmVzaWR1YWxzKG1vZGVsX2ZlX2JiX3Jlc2lkKS9zaWdtYShtb2RlbF9mZV9iYl9yZXNpZCkpCgpGaWcyX2JiX2ZlIDwtIFByb21ldGhpb25fYWN0aXZpdHlfZm9vZCAlPiUKICBnZ3Bsb3QoYWVzKHg9IChCZWFtX2JyZWFrcy8xMDAwMDApICx5PUZlZWRfZWZpY2llbmN5X2JiX3Jlc2lkKSkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGLCAgYWxwaGEgPSAwLjgsIHNpemUgPSAwLjUsIGNvbG9yID0gImJsYWNrIikrIAogIGdlb21fcG9pbnQoYWVzKGNvbG9yPSBDYXRlZ29yeSwgc2hhcGUgPSBTZXgpLCBhbHBoYSA9MC43LCBzaXplID0wLjc1LCBzaG93LmxlZ2VuZCA9IFQpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzPXNoYXBlX1NleCwgbGFiZWwgPSBjKCJGZW1hbGUiLCAiTWFsZSIpLG5hbWUgPSAiU2V4IikgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWNvbG9yX0NhdGVnb3J5LCBsYWJlbCA9IGMoZXhwcmVzc2lvbihpdGFsaWMoIktpbGxlZC1DTSIpKSwgZXhwcmVzc2lvbihpdGFsaWMoIkxpdmUtQ00iKSkpLCBuYW1lID0gIlRyZWF0bWVudCIpICsKICBsYWJzKHk9IkFkai4gZmVlZCBlZmZpY2llbmN5IiwgeD1leHByZXNzaW9uKHBhc3RlKCJCZWFtIGJyZWFrcyAoTnIpIHggIixlXjUpKSkgKwogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTApICsKICAgdGhlbWUoc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF9ibGFuaygpKSAKRmlnMl9iYl9mZQpgYGAKU2VwZXJhdGUgbW9kZWxzIGZvciBlYWNoIHNleCBmb3IgRmUgfiBkaXN0YW5jZQpgYGB7cn0Kc2V0LnNlZWQoNjczKQpQcm9tZXRoaW9uX2FjdGl2aXR5X2Zvb2RfTSA8LSBQcm9tZXRoaW9uX2FjdGl2aXR5X2Zvb2QgJT4lCiAgZHBseXI6OmZpbHRlcihTZXggPT0iTSIpICAlPiUKICBkcGx5cjo6bXV0YXRlKEZlZWRfZWZpY2llbmN5X25vcm0gPSBwcmVkaWN0KGJlc3ROb3JtYWxpemUoRmVlZF9lZmljaWVuY3kpKSkKClByb21ldGhpb25fYWN0aXZpdHlfZm9vZF9GIDwtIFByb21ldGhpb25fYWN0aXZpdHlfZm9vZCAgJT4lCiAgZHBseXI6OmZpbHRlcihTZXggPT0iRiIpICAlPiUKICBkcGx5cjo6bXV0YXRlKEZlZWRfZWZpY2llbmN5X25vcm0gPSBwcmVkaWN0KGJlc3ROb3JtYWxpemUoRmVlZF9lZmljaWVuY3kpKSkKCm1vZGVsX2ZlX2Rpc3RhbmNlX20gPC0gbG1lcihGZWVkX2VmaWNpZW5jeV9ub3JtfiBEaXN0YW5jZV90cmF2ZWxlZCArICgxfEJhdGNoKSwgUHJvbWV0aGlvbl9hY3Rpdml0eV9mb29kX00pCm1vZGVsX2ZlX2Rpc3RhbmNlX2YgPC0gbG1lcihGZWVkX2VmaWNpZW5jeV9ub3JtfiBEaXN0YW5jZV90cmF2ZWxlZCArICgxfEJhdGNoKSwgUHJvbWV0aGlvbl9hY3Rpdml0eV9mb29kX0YpCgpzaGFwaXJvLnRlc3QocmVzaWR1YWxzKG1vZGVsX2ZlX2Rpc3RhbmNlX20pKQpzaGFwaXJvLnRlc3QocmVzaWR1YWxzKG1vZGVsX2ZlX2Rpc3RhbmNlX2YpKQoKYW5vdmEobG0ocmVzaWR1YWxzKG1vZGVsX2ZlX2Rpc3RhbmNlX20pfmZpdHRlZC52YWx1ZXMobW9kZWxfZmVfZGlzdGFuY2VfbSkpKQphbm92YShsbShyZXNpZHVhbHMobW9kZWxfZmVfZGlzdGFuY2VfZil+Zml0dGVkLnZhbHVlcyhtb2RlbF9mZV9kaXN0YW5jZV9mKSkpCmBgYApgYGB7cn0KY2FyOjpBbm92YShtb2RlbF9mZV9kaXN0YW5jZV9tLCB0ZXN0LnN0YXRpc3RpYyA9IkYiLCB0eXBlID0iSUkiKQpjYXI6OkFub3ZhKG1vZGVsX2ZlX2Rpc3RhbmNlX2YsIHRlc3Quc3RhdGlzdGljID0iRiIsIHR5cGUgPSJJSSIpCmBgYAoKYGBge3J9CiNyMiBtYWxlcwpyMl9tb2RlbF9mZV9kaXN0YW5jZV9tX21hcjwtIHBhcnRSMihtb2RlbF9mZV9kaXN0YW5jZV9tLCBwYXJ0dmFycyA9IGMoIkRpc3RhbmNlX3RyYXZlbGVkIiksIAogICAgICAgICAgICAgICAgICBSMl90eXBlID0gIm1hcmdpbmFsIiwgbmJvb3QgPSAxMCkKcjJfbW9kZWxfZmVfZGlzdGFuY2VfbV9tYXIkUjIgJT4lIGRwbHlyOjpmaWx0ZXIodGVybSA9PSAiRGlzdGFuY2VfdHJhdmVsZWQiKSAlPiUgZHBseXI6OnNlbGVjdChlc3RpbWF0ZSkgJT4lIHB1bGwoKQoKI3IyIGZlbWFsZXMKcjJfbW9kZWxfZmVfZGlzdGFuY2VfZl9tYXI8LSBwYXJ0UjIobW9kZWxfZmVfZGlzdGFuY2VfZiwgcGFydHZhcnMgPSBjKCJEaXN0YW5jZV90cmF2ZWxlZCIpLCAKICAgICAgICAgICAgICAgICAgUjJfdHlwZSA9ICJtYXJnaW5hbCIsIG5ib290ID0gMTApCnIyX21vZGVsX2ZlX2Rpc3RhbmNlX2ZfbWFyJFIyICU+JSBkcGx5cjo6ZmlsdGVyKHRlcm0gPT0gIkRpc3RhbmNlX3RyYXZlbGVkIikgJT4lIGRwbHlyOjpzZWxlY3QoZXN0aW1hdGUpICU+JSBwdWxsKCkKCm1vZGVsX2ZlX2FsbG1fbV9yZXNpZCA8LSBsbWVyKEZlZWRfZWZpY2llbmN5X25vcm1+ICAoMXxCYXRjaCksIFByb21ldGhpb25fYWN0aXZpdHlfZm9vZF9NKQptb2RlbF9mZV9hbGxtX2ZfcmVzaWQgPC0gbG1lcihGZWVkX2VmaWNpZW5jeV9ub3JtfiAgKDF8QmF0Y2gpLCBQcm9tZXRoaW9uX2FjdGl2aXR5X2Zvb2RfRikKClByb21ldGhpb25fYWN0aXZpdHlfZm9vZF9NIDwtIFByb21ldGhpb25fYWN0aXZpdHlfZm9vZF9NICU+JQogIGRwbHlyOjptdXRhdGUoRmVlZF9lZmljaWVuY3lfZGlzdGFuY2VfcmVzaWQgPSByZXNpZHVhbHMobW9kZWxfZmVfYWxsbV9tX3Jlc2lkKS9zaWdtYShtb2RlbF9mZV9hbGxtX21fcmVzaWQpKQpQcm9tZXRoaW9uX2FjdGl2aXR5X2Zvb2RfRiA8LSBQcm9tZXRoaW9uX2FjdGl2aXR5X2Zvb2RfRiAlPiUKICBkcGx5cjo6bXV0YXRlKEZlZWRfZWZpY2llbmN5X2Rpc3RhbmNlX3Jlc2lkID0gcmVzaWR1YWxzKG1vZGVsX2ZlX2FsbG1fZl9yZXNpZCkvc2lnbWEobW9kZWxfZmVfYWxsbV9mX3Jlc2lkKSkKClByb21ldGhpb25fYWN0aXZpdHlfZm9vZF9NRiA8LSByYmluZChQcm9tZXRoaW9uX2FjdGl2aXR5X2Zvb2RfTSwgUHJvbWV0aGlvbl9hY3Rpdml0eV9mb29kX0YpCgoKRmlnMl9mZV9kaXN0YW5jZSA8LSBQcm9tZXRoaW9uX2FjdGl2aXR5X2Zvb2RfTUYgJT4lCiAgZ2dwbG90KGFlcyh4PSAoRGlzdGFuY2VfdHJhdmVsZWQvMTAwMCkgLHk9RmVlZF9lZmljaWVuY3lfZGlzdGFuY2VfcmVzaWQpKSsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEYsICBhbHBoYSA9IDAuOCwgc2l6ZSA9IDAuNSwgY29sb3IgPSAiYmxhY2siKSsgCiAgZ2VvbV9wb2ludChhZXMoY29sb3I9IENhdGVnb3J5LCBzaGFwZSA9IFNleCksIGFscGhhID0wLjcsIHNpemUgPTAuNzUsIHNob3cubGVnZW5kID0gVCkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXM9c2hhcGVfU2V4LCBsYWJlbCA9IGMoIkZlbWFsZSIsICJNYWxlIiksbmFtZSA9ICJTZXgiKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9Y29sb3JfQ2F0ZWdvcnksIGxhYmVsID0gYyhleHByZXNzaW9uKGl0YWxpYygiS2lsbGVkLUNNIikpLCBleHByZXNzaW9uKGl0YWxpYygiTGl2ZS1DTSIpKSksIG5hbWUgPSAiVHJlYXRtZW50IikgKwogIGxhYnMoeT0iQWRqLiBmZWVkIGVmZmljaWVuY3kiLCB4PSJEaXN0YW5jZSB0cmF2ZWxlZCAoa20pIikgKwogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTApICsKICBmYWNldF93cmFwKC5+U2V4LCBzY2FsZXMgPSAiZnJlZSIsIG5jb2wgPTEpICsgCiAgIHRoZW1lKHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSkgCkZpZzJfZmVfZGlzdGFuY2UKYGBgCgoKIyMjIEVuZXJneSBleHBlbmRpdHVyZQpgYGB7cn0KRmlnMl9lZV93ZWlnaHQ8LSBQcm9tZXRoaW9uX2FjdGl2aXR5X2VlICU+JQogIGdncGxvdChhZXMoeD0gUHJvbWV0aGlvbl93ZWlnaHQgLHk9RUVfYXZlcmFnZV9wZXJfaG91ciwgY29sb3I9IENhdGVnb3J5LCBncm91cCA9IENhdGVnb3J5KSkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRiwgIGFscGhhID0gMC44LCBzaXplID0gMC41KSsgCiAgZ2VvbV9wb2ludChhZXMoc2hhcGUgPSBTZXgpLCBhbHBoYSA9MC43LCBzaXplID0wLjc1LCBzaG93LmxlZ2VuZCA9IFQpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzPXNoYXBlX1NleCwgbGFiZWwgPSBjKCJGZW1hbGUiLCAiTWFsZSIpLG5hbWUgPSAiU2V4IikgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWNvbG9yX0NhdGVnb3J5LCBsYWJlbCA9IGMoZXhwcmVzc2lvbihpdGFsaWMoIktpbGxlZC1DTSIpKSwgZXhwcmVzc2lvbihpdGFsaWMoIkxpdmUtQ00iKSkpLCBuYW1lID0gIlRyZWF0bWVudCIpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDEwKSArCiAgbGFicyh5ID0gIkVuZXJneSBleHBlbmRpdHVyZSAoa2NhbC9oKSIsIHggPSAiV2VpZ2h0IChnKSIpICsKICBmYWNldF93cmFwKC5+U2V4LCBzY2FsZXMgPSAiZnJlZSIsIG5jb2wgPTEpICsgCiAgdGhlbWUoc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSkgCkZpZzJfZWVfd2VpZ2h0CmBgYApgYGB7cn0Kc2V0LnNlZWQoNzE5KSAKClByb21ldGhpb25fYWN0aXZpdHlfZWUuMiA8LSBQcm9tZXRoaW9uX2FjdGl2aXR5X2VlICU+JQogIGRyb3BfbmEoUHJvbWV0aGlvbl93ZWlnaHQpCgpQcm9tZXRoaW9uX2FjdGl2aXR5X2VlLjIkUHJvbWV0aGlvbl93ZWlnaHRfbm9ybSA8LSBwcmVkaWN0KGJlc3ROb3JtYWxpemUoUHJvbWV0aGlvbl9hY3Rpdml0eV9lZS4yJFByb21ldGhpb25fd2VpZ2h0KSkKUHJvbWV0aGlvbl9hY3Rpdml0eV9lZS4yJEVFX2F2ZXJhZ2VfcGVyX2hvdXJfbm9ybTwtIHByZWRpY3QoYmVzdE5vcm1hbGl6ZShQcm9tZXRoaW9uX2FjdGl2aXR5X2VlLjIkRUVfYXZlcmFnZV9wZXJfaG91cikpCgpvcHRpb25zKGNvbnRyYXN0cz1jKCJjb250ci5zdW0iLCAiY29udHIucG9seSIpKQoKbW9kZWxfZWU8LShsbWVyKEVFX2F2ZXJhZ2VfcGVyX2hvdXJfbm9ybSB+IENhdGVnb3J5KlNleCArIFNleCpQcm9tZXRoaW9uX3dlaWdodF9ub3JtICArIChDYXRlZ29yeSB8QmF0Y2gvU2V4L1Byb21ldGhpb25fQ2FiaW5ldCksIFByb21ldGhpb25fYWN0aXZpdHlfZWUuMikpCnN0ZXAobW9kZWxfZWUsIGtlZXAgPSJDYXRlZ29yeSIpCmBgYApgYGB7cn0Kb3B0aW9ucyhjb250cmFzdHM9YygiY29udHIuc3VtIiwgImNvbnRyLnBvbHkiKSkKbW9kZWxfZWUuMjwtKGxtZXIoRUVfYXZlcmFnZV9wZXJfaG91ciB+IENhdGVnb3J5KlNleCArIFByb21ldGhpb25fd2VpZ2h0ICsgKDEgfCBCYXRjaCksIFByb21ldGhpb25fYWN0aXZpdHlfZWUuMikpCnN0YXRzOjpzaGFwaXJvLnRlc3QocmVzaWQobW9kZWxfZWUuMikpCmFub3ZhKGxtKHJlc2lkdWFscyhtb2RlbF9lZS4yKX5maXR0ZWQudmFsdWVzKG1vZGVsX2VlLjIpKSkKYGBgCmBgYHtyfQpQcm9tZXRoaW9uX2FjdGl2aXR5X2VlLjJfTSA8LSBQcm9tZXRoaW9uX2FjdGl2aXR5X2VlLjIgJT4lIGRwbHlyOjpmaWx0ZXIoU2V4ID09Ik0iKQpQcm9tZXRoaW9uX2FjdGl2aXR5X2VlLjJfRiA8LSBQcm9tZXRoaW9uX2FjdGl2aXR5X2VlLjIgJT4lIGRwbHlyOjpmaWx0ZXIoU2V4ID09IkYiKQoKbW9kZWxfZWUuTTwtKGxtZXIoRUVfYXZlcmFnZV9wZXJfaG91ciB+IENhdGVnb3J5ICsgUHJvbWV0aGlvbl93ZWlnaHQgKyAoMSB8IEJhdGNoKSwgUHJvbWV0aGlvbl9hY3Rpdml0eV9lZS4yX00pKQptb2RlbF9lZS5GPC0obG1lcihFRV9hdmVyYWdlX3Blcl9ob3VyIH4gQ2F0ZWdvcnkgKyBQcm9tZXRoaW9uX3dlaWdodCArICgxIHwgQmF0Y2gpLCBQcm9tZXRoaW9uX2FjdGl2aXR5X2VlLjJfRikpCgpzaGFwaXJvLnRlc3QocmVzaWR1YWxzKG1vZGVsX2VlLk0pKQpzaGFwaXJvLnRlc3QocmVzaWR1YWxzKG1vZGVsX2VlLkYpKQoKYW92KGxtKHJlc2lkdWFscyhtb2RlbF9lZS5NKX5maXR0ZWQudmFsdWVzKG1vZGVsX2VlLk0pKSkKYW92KGxtKHJlc2lkdWFscyhtb2RlbF9lZS5GKX5maXR0ZWQudmFsdWVzKG1vZGVsX2VlLkYpKSkKCmNhcjo6QW5vdmEobW9kZWxfZWUuTSwgdGVzdC5zdGF0aXN0aWMgPSJGIiwgdHlwZSA9IklJIikKY2FyOjpBbm92YShtb2RlbF9lZS5GLCB0ZXN0LnN0YXRpc3RpYyA9IkYiLCB0eXBlID0iSUkiKQoKZWZmZWN0czo6ZWZmZWN0KCJDYXRlZ29yeSIsIG1vZCA9IG1vZGVsX2VlLk0sIHNlID1UUlVFKSAlPiUgYXMuZGF0YS5mcmFtZSgpCmVmZmVjdHM6OmVmZmVjdCgiQ2F0ZWdvcnkiLCBtb2QgPSBtb2RlbF9lZS5GLCBzZSA9VFJVRSkgJT4lIGFzLmRhdGEuZnJhbWUoKQpgYGAKYGBge3J9Cm1vZGVsX2VlX3Jlc2lkdWFsc19NIDwtKGxtZXIoRUVfYXZlcmFnZV9wZXJfaG91ciB+IFByb21ldGhpb25fd2VpZ2h0ICsgKDEgfCBCYXRjaCkgLCBQcm9tZXRoaW9uX2FjdGl2aXR5X2VlLjJfTSkpIApQcm9tZXRoaW9uX2FjdGl2aXR5X2VlLjJfTSRFRV9hdmVyYWdlX3Blcl9ob3VyX3Jlc2lkdWFsIDwtIHJlc2lkdWFscyhtb2RlbF9lZV9yZXNpZHVhbHNfTSkvc2lnbWEobW9kZWxfZWVfcmVzaWR1YWxzX00pCgptb2RlbF9lZV9yZXNpZHVhbHNfRiA8LShsbWVyKEVFX2F2ZXJhZ2VfcGVyX2hvdXIgfiAgUHJvbWV0aGlvbl93ZWlnaHQgKyAoMSB8IEJhdGNoKSAsIFByb21ldGhpb25fYWN0aXZpdHlfZWUuMl9GKSkgClByb21ldGhpb25fYWN0aXZpdHlfZWUuMl9GJEVFX2F2ZXJhZ2VfcGVyX2hvdXJfcmVzaWR1YWwgPC0gcmVzaWR1YWxzKG1vZGVsX2VlX3Jlc2lkdWFsc19GKS9zaWdtYShtb2RlbF9lZV9yZXNpZHVhbHNfRikKClByb21ldGhpb25fYWN0aXZpdHlfZWUuMl9NRiA8LSByYmluZChQcm9tZXRoaW9uX2FjdGl2aXR5X2VlLjJfTSwgUHJvbWV0aGlvbl9hY3Rpdml0eV9lZS4yX0YpCgpGaWcyX2VlX3Jlc2lkIDwtIFByb21ldGhpb25fYWN0aXZpdHlfZWUuMl9NRiAlPiUKICBnZ3Bsb3QoYWVzKHggPSBDYXRlZ29yeSwgeSA9IEVFX2F2ZXJhZ2VfcGVyX2hvdXJfcmVzaWR1YWwsIHNoYXBlID0gU2V4LCBjb2xvciA9IENhdGVnb3J5KSkgKyAKICBnZW9tX3F1YXNpcmFuZG9tKGFscGhhID0gMC43LCBzaXplID0gMC43NSkgKwogIHN0YXRfc3VtbWFyeShmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2l6ZT0yLCBhZXMoZ3JvdXAgPSBDYXRlZ29yeSksIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjYsIHNoYXBlID0gMTUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JfQ2F0ZWdvcnksIGxhYmVsID0gYygiS2lsbGVkLUNNIiwgIkxpdmUtQ00iKSwgbmFtZSA9ICJUcmVhdG1lbnQiKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IHNoYXBlX1NleCwgbGFiZWwgPSBjKCJGZW1hbGUiLCAiTWFsZSIpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiS2lsbGVkIiA9ICJLaWxsZWQtXG5DTSIsICJMaXZlIiA9ICJMaXZlLVxuQ00iKSkgKwogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTApICsKICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIGxhYnMoeSA9ICJBZGouIGVuZXJneSBleHBlbmRpdHVyZSIpICsKICBmYWNldF93cmFwKC5+U2V4LCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9MSkgKyAKICB0aGVtZShzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICBzdHJpcC50ZXh0ID0gZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpIApGaWcyX2VlX3Jlc2lkCmBgYAojIyMjIENpcmNhZGlhbgpgYGB7cn0KIyBSZXN0aW5nIG1ldGFib2xpYyByYXRlIChSTVIpIGZvciBlYWNoIGN5Y2xlCkNpcmNhZGlhbl9STVJfYWxsIDwtIENpcmNhZGlhbi4yICU+JQogIGRwbHlyOjphcnJhbmdlKFN0YXJ0RGF0ZV9jb21tb24sIGRlc2MoQ3ljbGUpKSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoTW91c2VJRCkgJT4lCiAgZHBseXI6OnN1bW1hcmlzZShBbGxfUk1SID1tZWFuKFFSX0VFXzMwKSkgJT4lCiAgI2RwbHlyOjpmaWx0ZXIoRGF5ID09IDMgJiBDeWNsZSA9PSAwKSAlPiUKICBkcGx5cjo6c2VsZWN0KE1vdXNlSUQsIEFsbF9STVIpJT4lCiAgZHBseXI6OnVuZ3JvdXAoKQpDaXJjYWRpYW5fUk1SX2RhcmsgPC0gQ2lyY2FkaWFuLjIgJT4lIAogIGRwbHlyOjpmaWx0ZXIoQ3ljbGUgPT0gMCkgICU+JSAjIDAgPSBkYXJrIGN5Y2xlID0gYWN0aXZpdHkgcGVyaW9kIG9mIG1pY2UgKG5vY3R1cm5hbCkKICBkcGx5cjo6YXJyYW5nZShTdGFydERhdGVfY29tbW9uLCBkZXNjKEN5Y2xlKSkgJT4lCiAgZHBseXI6Omdyb3VwX2J5KE1vdXNlSUQpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UoRGFya19STVIgPW1lYW4oUVJfRUVfMzApKSU+JQogICNkcGx5cjo6ZmlsdGVyKERheSA9PSAzKSAlPiUKICBkcGx5cjo6c2VsZWN0KE1vdXNlSUQsIERhcmtfUk1SKSU+JQogIGRwbHlyOjp1bmdyb3VwKCkKQ2lyY2FkaWFuX1JNUl9saWdodCA8LSBDaXJjYWRpYW4uMiAlPiUgCiAgZHBseXI6OmZpbHRlcihDeWNsZSA9PSAxKSAgJT4lICMgMSA9IGxpZ2h0IGN5Y2xlID0gcmVzdGluZyBwZXJpb2Qgb2YgbWljZSAobm9jdHVybmFsKQogIGRwbHlyOjphcnJhbmdlKFN0YXJ0RGF0ZV9jb21tb24sIGRlc2MoQ3ljbGUpKSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoTW91c2VJRCkgJT4lCiAgZHBseXI6OnN1bW1hcmlzZShMaWdodF9STVIgPW1lYW4oUVJfRUVfMzApKSAlPiUKICAjZHBseXI6OmZpbHRlcihEYXkgPT0gMykgJT4lCiAgZHBseXI6OnNlbGVjdChNb3VzZUlELCBMaWdodF9STVIpJT4lCiAgZHBseXI6OnVuZ3JvdXAoKQoKQ2lyY2FkaWFuX1JNUiA8LSBDaXJjYWRpYW5fUk1SX2FsbCAlPiUKICBkcGx5cjo6bGVmdF9qb2luKENpcmNhZGlhbl9STVJfZGFyaywgYnkgPSJNb3VzZUlEIikgJT4lIAogIGRwbHlyOjpsZWZ0X2pvaW4oQ2lyY2FkaWFuX1JNUl9saWdodCwgYnkgPSJNb3VzZUlEIikgJT4lIAogIGRwbHlyOjpsZWZ0X2pvaW4obWV0YWRhdGEsIGJ5ID1jKCJNb3VzZUlEIikpICU+JQogIHRpZHlyOjpkcm9wX25hKFByb21ldGhpb25fd2VpZ2h0KQogIApgYGAKYGBge3J9CnNldC5zZWVkKDYxMikKb3B0aW9ucyhjb250cmFzdHM9YygiY29udHIuc3VtIiwgImNvbnRyLnBvbHkiKSkKCgpDaXJjYWRpYW5fUk1SJEFsbF9STVJfbm9ybTwtIHByZWRpY3QoYmVzdE5vcm1hbGl6ZTo6bG9nX3goQ2lyY2FkaWFuX1JNUiRBbGxfUk1SKSkKQ2lyY2FkaWFuX1JNUiREYXJrX1JNUl9ub3JtPC0gcHJlZGljdChiZXN0Tm9ybWFsaXplOjpsb2dfeChDaXJjYWRpYW5fUk1SJERhcmtfUk1SKSkKQ2lyY2FkaWFuX1JNUiRMaWdodF9STVJfbm9ybTwtIHByZWRpY3QoYmVzdE5vcm1hbGl6ZTo6bG9nX3goQ2lyY2FkaWFuX1JNUiRMaWdodF9STVIpKQpDaXJjYWRpYW5fUk1SJFByb21ldGhpb25fd2VpZ2h0X25vcm08LSBwcmVkaWN0KGJlc3ROb3JtYWxpemUoQ2lyY2FkaWFuX1JNUiRQcm9tZXRoaW9uX3dlaWdodCkpCgpDaXJjYWRpYW5fUk1SX00gPC0gQ2lyY2FkaWFuX1JNUiAlPiUgZHBseXI6OmZpbHRlcihTZXggPT0gIk0iKQpDaXJjYWRpYW5fUk1SX0YgPC0gQ2lyY2FkaWFuX1JNUiAlPiUgZHBseXI6OmZpbHRlcihTZXggPT0gIkYiKQoKbW9kZWxfcm1yX2FsbF9tPC0obG1lcihBbGxfUk1SX25vcm0gfiBDYXRlZ29yeSsgUHJvbWV0aGlvbl93ZWlnaHRfbm9ybSArICgxIHxCYXRjaC9Qcm9tZXRoaW9uX0NhYmluZXQpLCBDaXJjYWRpYW5fUk1SX00pKQptb2RlbF9ybXJfZGFya19tPC0obG1lcihEYXJrX1JNUl9ub3JtIH4gQ2F0ZWdvcnkrIFByb21ldGhpb25fd2VpZ2h0X25vcm0gKyAoMSB8QmF0Y2gvUHJvbWV0aGlvbl9DYWJpbmV0KSwgQ2lyY2FkaWFuX1JNUl9NKSkKbW9kZWxfcm1yX2xpZ2h0X208LShsbWVyKExpZ2h0X1JNUl9ub3JtIH4gQ2F0ZWdvcnkrIFByb21ldGhpb25fd2VpZ2h0X25vcm0gKyAoMSB8QmF0Y2gvUHJvbWV0aGlvbl9DYWJpbmV0KSwgQ2lyY2FkaWFuX1JNUl9NKSkKCm1vZGVsX3Jtcl9hbGxfZjwtKGxtZXIoQWxsX1JNUl9ub3JtIH4gQ2F0ZWdvcnkrIFByb21ldGhpb25fd2VpZ2h0X25vcm0gKyAoMSB8QmF0Y2gvUHJvbWV0aGlvbl9DYWJpbmV0KSwgQ2lyY2FkaWFuX1JNUl9GKSkKbW9kZWxfcm1yX2RhcmtfZjwtKGxtZXIoRGFya19STVJfbm9ybSB+IENhdGVnb3J5KyBQcm9tZXRoaW9uX3dlaWdodF9ub3JtICsgKDEgfEJhdGNoL1Byb21ldGhpb25fQ2FiaW5ldCksIENpcmNhZGlhbl9STVJfRikpCm1vZGVsX3Jtcl9saWdodF9mPC0obG1lcihMaWdodF9STVJfbm9ybSB+IENhdGVnb3J5KyBQcm9tZXRoaW9uX3dlaWdodF9ub3JtICsgKDEgfEJhdGNoL1Byb21ldGhpb25fQ2FiaW5ldCksIENpcmNhZGlhbl9STVJfRikpCgpzdGVwKG1vZGVsX3Jtcl9hbGxfbSkKc3RlcChtb2RlbF9ybXJfZGFya19tKQpzdGVwKG1vZGVsX3Jtcl9saWdodF9tKQoKc3RlcChtb2RlbF9ybXJfYWxsX2YpCnN0ZXAobW9kZWxfcm1yX2RhcmtfZikKc3RlcChtb2RlbF9ybXJfbGlnaHRfZikKYGBgCmBgYHtyfQpzZXQuc2VlZCgxNDkpCgpvcHRpb25zKGNvbnRyYXN0cz1jKCJjb250ci5zdW0iLCAiY29udHIucG9seSIpKQptb2RlbF9ybXJfYWxsX20yPC0obG1lcihBbGxfUk1SX25vcm0gfiBDYXRlZ29yeSsgUHJvbWV0aGlvbl93ZWlnaHRfbm9ybSArICgxIHxCYXRjaCksIENpcmNhZGlhbl9STVJfTSkpCm1vZGVsX3Jtcl9kYXJrX20yPC0obG1lcihEYXJrX1JNUl9ub3JtIH4gQ2F0ZWdvcnkrIFByb21ldGhpb25fd2VpZ2h0X25vcm0gKyAoMSB8QmF0Y2gpLCBDaXJjYWRpYW5fUk1SX00pKQptb2RlbF9ybXJfbGlnaHRfbTI8LShsbWVyKExpZ2h0X1JNUl9ub3JtIH4gQ2F0ZWdvcnkrIFByb21ldGhpb25fd2VpZ2h0X25vcm0gKyAoMSB8QmF0Y2gpLCBDaXJjYWRpYW5fUk1SX00pKQoKbW9kZWxfcm1yX2FsbF9mMjwtKGxtZXIoQWxsX1JNUl9ub3JtIH4gQ2F0ZWdvcnkrIFByb21ldGhpb25fd2VpZ2h0X25vcm0gKyAoMSB8QmF0Y2gpLCBDaXJjYWRpYW5fUk1SX0YpKQptb2RlbF9ybXJfZGFya19mMjwtKGxtZXIoRGFya19STVJfbm9ybSB+IENhdGVnb3J5KyBQcm9tZXRoaW9uX3dlaWdodF9ub3JtICsgKDEgfEJhdGNoKSwgQ2lyY2FkaWFuX1JNUl9GKSkKbW9kZWxfcm1yX2xpZ2h0X2YyPC0obG1lcihMaWdodF9STVJfbm9ybSB+IENhdGVnb3J5KyBQcm9tZXRoaW9uX3dlaWdodF9ub3JtICsgKDEgfEJhdGNoKSwgQ2lyY2FkaWFuX1JNUl9GKSkKCnNoYXBpcm8udGVzdChyZXNpZHVhbHMobW9kZWxfcm1yX2FsbF9tMikpCnNoYXBpcm8udGVzdChyZXNpZHVhbHMobW9kZWxfcm1yX2RhcmtfbTIpKQpzaGFwaXJvLnRlc3QocmVzaWR1YWxzKG1vZGVsX3Jtcl9saWdodF9tMikpCmFub3ZhKGxtKHJlc2lkdWFscyhtb2RlbF9ybXJfYWxsX20yKSB+IGZpdHRlZC52YWx1ZXMobW9kZWxfcm1yX2FsbF9tMikpKQphbm92YShsbShyZXNpZHVhbHMobW9kZWxfcm1yX2RhcmtfbTIpIH4gZml0dGVkLnZhbHVlcyhtb2RlbF9ybXJfZGFya19tMikpKQphbm92YShsbShyZXNpZHVhbHMobW9kZWxfcm1yX2xpZ2h0X20yKSB+IGZpdHRlZC52YWx1ZXMobW9kZWxfcm1yX2xpZ2h0X20yKSkpCgpzaGFwaXJvLnRlc3QocmVzaWR1YWxzKG1vZGVsX3Jtcl9hbGxfZjIpKQpzaGFwaXJvLnRlc3QocmVzaWR1YWxzKG1vZGVsX3Jtcl9kYXJrX2YyKSkKc2hhcGlyby50ZXN0KHJlc2lkdWFscyhtb2RlbF9ybXJfbGlnaHRfZjIpKQphbm92YShsbShyZXNpZHVhbHMobW9kZWxfcm1yX2FsbF9mMikgfiBmaXR0ZWQudmFsdWVzKG1vZGVsX3Jtcl9hbGxfZjIpKSkKYW5vdmEobG0ocmVzaWR1YWxzKG1vZGVsX3Jtcl9kYXJrX2YyKSB+IGZpdHRlZC52YWx1ZXMobW9kZWxfcm1yX2RhcmtfZjIpKSkKYW5vdmEobG0ocmVzaWR1YWxzKG1vZGVsX3Jtcl9saWdodF9mMikgfiBmaXR0ZWQudmFsdWVzKG1vZGVsX3Jtcl9saWdodF9mMikpKQpgYGAKYGBge3IgZXZhbCA9RkFMU0UgfQpwbG90KG1vZGVsX3Jtcl9hbGxfbTIpCnBsb3QobW9kZWxfcm1yX2RhcmtfbTIpCnBsb3QobW9kZWxfcm1yX2xpZ2h0X20yKQoKcGxvdChtb2RlbF9ybXJfYWxsX2YyKQpwbG90KG1vZGVsX3Jtcl9kYXJrX2YyKQpwbG90KG1vZGVsX3Jtcl9saWdodF9mMikKYGBgCmBgYHtyIGV2YWwgPUZBTFNFIH0Kb3B0aW9ucyhjb250cmFzdHM9YygiY29udHIuc3VtIiwgImNvbnRyLnBvbHkiKSkKCnJlc3VsdHNfbW9kZWxfcm1yX2FsbF9tIDwtIGNhcjo6QW5vdmEobW9kZWxfcm1yX2FsbF9tMiwgdGVzdC5zdGF0aXN0aWMgPSJGIiwgdHlwZSA9IklJIikgJT4lIAogIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4odmFyID0gIm1vZGVsX3Rlcm0iKSAlPiUKICBkcGx5cjo6bXV0YXRlKENpcmMgPSAiQWxsIiwgCiAgICAgICAgICAgICAgICBTZXggPSAiTSIpIApyZXN1bHRzX21vZGVsX3Jtcl9kYXJrX20gPC0gY2FyOjpBbm92YShtb2RlbF9ybXJfZGFya19tMiwgdGVzdC5zdGF0aXN0aWMgPSJGIiwgdHlwZSA9IklJIikgJT4lIAogIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4odmFyID0gIm1vZGVsX3Rlcm0iKSAlPiUKICBkcGx5cjo6bXV0YXRlKENpcmMgPSAiRGFyayIsIAogICAgICAgICAgICAgICAgU2V4ID0gIk0iKSAKcmVzdWx0c19tb2RlbF9ybXJfbGlnaHRfbTwtY2FyOjpBbm92YShtb2RlbF9ybXJfbGlnaHRfbTIsIHRlc3Quc3RhdGlzdGljID0iRiIsIHR5cGUgPSJJSSIpICU+JSAKICBhcy5kYXRhLmZyYW1lKCkgJT4lIAogIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJtb2RlbF90ZXJtIikgJT4lCiAgZHBseXI6Om11dGF0ZShDaXJjID0gIkxpZ2h0IiwgCiAgICAgICAgICAgICAgICBTZXggPSAiTSIpCgpyZXN1bHRzX21vZGVsX3Jtcl9hbGxfZiA8LSBjYXI6OkFub3ZhKG1vZGVsX3Jtcl9hbGxfZjIsIHRlc3Quc3RhdGlzdGljID0iRiIsIHR5cGUgPSJJSSIpICU+JSAKICBhcy5kYXRhLmZyYW1lKCkgJT4lIAogIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJtb2RlbF90ZXJtIikgJT4lCiAgZHBseXI6Om11dGF0ZShDaXJjID0gIkFsbCIsIAogICAgICAgICAgICAgICAgU2V4ID0gIkYiKSAKcmVzdWx0c19tb2RlbF9ybXJfZGFya19mIDwtIGNhcjo6QW5vdmEobW9kZWxfcm1yX2RhcmtfZjIsIHRlc3Quc3RhdGlzdGljID0iRiIsIHR5cGUgPSJJSSIpICU+JSAKICBhcy5kYXRhLmZyYW1lKCkgJT4lIAogIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJtb2RlbF90ZXJtIikgJT4lCiAgZHBseXI6Om11dGF0ZShDaXJjID0gIkRhcmsiLCAKICAgICAgICAgICAgICAgIFNleCA9ICJGIikgCnJlc3VsdHNfbW9kZWxfcm1yX2xpZ2h0X2YgPC1jYXI6OkFub3ZhKG1vZGVsX3Jtcl9saWdodF9mMiwgdGVzdC5zdGF0aXN0aWMgPSJGIiwgdHlwZSA9IklJIikgJT4lIAogIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4odmFyID0gIm1vZGVsX3Rlcm0iKSAlPiUKICBkcGx5cjo6bXV0YXRlKENpcmMgPSAiTGlnaHQiLCAKICAgICAgICAgICAgICAgIFNleCA9ICJGIikKCgpyYmluZChyZXN1bHRzX21vZGVsX3Jtcl9hbGxfbSwgcmVzdWx0c19tb2RlbF9ybXJfZGFya19tLCByZXN1bHRzX21vZGVsX3Jtcl9saWdodF9tLCAKICAgICAgcmVzdWx0c19tb2RlbF9ybXJfYWxsX2YsIHJlc3VsdHNfbW9kZWxfcm1yX2RhcmtfZiwgcmVzdWx0c19tb2RlbF9ybXJfbGlnaHRfZikgJT4lCiAgZHBseXI6OmZpbHRlcihtb2RlbF90ZXJtID09ICJDYXRlZ29yeSIpIApgYGAKYGBge3J9Cm1vZGVsX3Jlc3RfYWxsLnJtcl9tZWZmPC0obG1lcihBbGxfUk1SIH4gQ2F0ZWdvcnkrIFByb21ldGhpb25fd2VpZ2h0X25vcm0gKyAoMSB8QmF0Y2gpLCBDaXJjYWRpYW5fUk1SX00pKQptb2RlbF9yZXN0X2Rhcmsucm1yX21lZmY8LShsbWVyKERhcmtfUk1SIH4gQ2F0ZWdvcnkrIFByb21ldGhpb25fd2VpZ2h0X25vcm0gKyAoMSB8QmF0Y2gpLCBDaXJjYWRpYW5fUk1SX00pKQptb2RlbF9yZXN0X2xpZ2h0LnJtcl9tZWZmPC0obG1lcihMaWdodF9STVIgfiBDYXRlZ29yeSsgUHJvbWV0aGlvbl93ZWlnaHRfbm9ybSArICgxIHxCYXRjaCksIENpcmNhZGlhbl9STVJfTSkpCgptb2RlbF9yZXN0X2FsbC5ybXJfZmVmZjwtKGxtZXIoQWxsX1JNUiB+IENhdGVnb3J5KyBQcm9tZXRoaW9uX3dlaWdodF9ub3JtICsgKDEgfEJhdGNoKSwgQ2lyY2FkaWFuX1JNUl9GKSkKbW9kZWxfcmVzdF9kYXJrLnJtcl9mZWZmPC0obG1lcihEYXJrX1JNUiB+IENhdGVnb3J5KyBQcm9tZXRoaW9uX3dlaWdodF9ub3JtICsgKDEgfEJhdGNoKSwgQ2lyY2FkaWFuX1JNUl9GKSkKbW9kZWxfcmVzdF9saWdodC5ybXJfZmVmZjwtKGxtZXIoTGlnaHRfUk1SIH4gQ2F0ZWdvcnkrIFByb21ldGhpb25fd2VpZ2h0X25vcm0gKyAoMSB8QmF0Y2gpLCBDaXJjYWRpYW5fUk1SX0YpKQoKZWZmX1JNUl9hbGxfbTwtIGVmZmVjdHM6OmVmZmVjdCgiQ2F0ZWdvcnkiLCBtb2RlbF9yZXN0X2FsbC5ybXJfbWVmZiwgc2UgPSBUUlVFKSAlPiUgYXMuZGF0YS5mcmFtZSAlPiUgZHBseXI6Om11dGF0ZShDaXJjID0iQWxsIiwgU2V4ID0iTSIpCmVmZl9STVJfZGFya19tPC0gZWZmZWN0czo6ZWZmZWN0KCJDYXRlZ29yeSIsIG1vZGVsX3Jlc3RfZGFyay5ybXJfbWVmZiwgc2UgPSBUUlVFKSAlPiUgYXMuZGF0YS5mcmFtZSAlPiUgZHBseXI6Om11dGF0ZShDaXJjID0iZGFyayIsIFNleCA9Ik0iKQplZmZfUk1SX2xpZ2h0X208LSBlZmZlY3RzOjplZmZlY3QoIkNhdGVnb3J5IiwgbW9kZWxfcmVzdF9saWdodC5ybXJfbWVmZiwgc2UgPSBUUlVFKSAlPiUgYXMuZGF0YS5mcmFtZSAlPiUgZHBseXI6Om11dGF0ZShDaXJjID0ibGlnaHQiLCBTZXggPSJNIikKCmVmZl9STVJfYWxsX2Y8LSBlZmZlY3RzOjplZmZlY3QoIkNhdGVnb3J5IiwgbW9kZWxfcmVzdF9hbGwucm1yX2ZlZmYsIHNlID0gVFJVRSkgJT4lIGFzLmRhdGEuZnJhbWUgJT4lIGRwbHlyOjptdXRhdGUoQ2lyYyA9IkFsbCIsIFNleCA9IkYiKQplZmZfUk1SX2RhcmtfZjwtIGVmZmVjdHM6OmVmZmVjdCgiQ2F0ZWdvcnkiLCBtb2RlbF9yZXN0X2Rhcmsucm1yX2ZlZmYsIHNlID0gVFJVRSkgJT4lIGFzLmRhdGEuZnJhbWUgJT4lIGRwbHlyOjptdXRhdGUoQ2lyYyA9ImRhcmsiLCBTZXggPSJGIikKZWZmX1JNUl9saWdodF9mPC0gZWZmZWN0czo6ZWZmZWN0KCJDYXRlZ29yeSIsIG1vZGVsX3Jlc3RfbGlnaHQucm1yX2ZlZmYsIHNlID0gVFJVRSkgJT4lIGFzLmRhdGEuZnJhbWUgJT4lIGRwbHlyOjptdXRhdGUoQ2lyYyA9ImxpZ2h0IiwgU2V4ID0iRiIpCgpyYmluZChlZmZfUk1SX2FsbF9tLCBlZmZfUk1SX2RhcmtfbSwgZWZmX1JNUl9saWdodF9tLCBlZmZfUk1SX2FsbF9mLCBlZmZfUk1SX2RhcmtfZiwgZWZmX1JNUl9saWdodF9mKSAlPiUgZHBseXI6OnNlbGVjdChTZXgsIENhdGVnb3J5LCBDaXJjLCBmaXQsIHNlKQpgYGAKYGBge3J9Cm1vZGVsX3Jlc3RfYWxsLnJtcl9tX3Jlc2lkPC0obG1lcihBbGxfUk1SX25vcm0gfiAgUHJvbWV0aGlvbl93ZWlnaHRfbm9ybSArICgxIHxCYXRjaCksIENpcmNhZGlhbl9STVJfTSkpCm1vZGVsX3Jlc3RfZGFyay5ybXJfbV9yZXNpZDwtKGxtZXIoRGFya19STVJfbm9ybSB+ICBQcm9tZXRoaW9uX3dlaWdodF9ub3JtICsgKDEgfEJhdGNoKSwgQ2lyY2FkaWFuX1JNUl9NKSkKbW9kZWxfcmVzdF9saWdodC5ybXJfbV9yZXNpZDwtKGxtZXIoTGlnaHRfUk1SX25vcm0gfiAgUHJvbWV0aGlvbl93ZWlnaHRfbm9ybSArICgxIHxCYXRjaCksIENpcmNhZGlhbl9STVJfTSkpCgptb2RlbF9yZXN0X2FsbC5ybXJfZl9yZXNpZDwtKGxtZXIoQWxsX1JNUl9ub3JtIH4gIFByb21ldGhpb25fd2VpZ2h0X25vcm0gKyAoMSB8QmF0Y2gpLCBDaXJjYWRpYW5fUk1SX0YpKQptb2RlbF9yZXN0X2Rhcmsucm1yX2ZfcmVzaWQ8LShsbWVyKERhcmtfUk1SX25vcm0gfiBQcm9tZXRoaW9uX3dlaWdodF9ub3JtICsgKDEgfEJhdGNoKSwgQ2lyY2FkaWFuX1JNUl9GKSkKbW9kZWxfcmVzdF9saWdodC5ybXJfZl9yZXNpZDwtKGxtZXIoTGlnaHRfUk1SX25vcm0gfiAgUHJvbWV0aGlvbl93ZWlnaHRfbm9ybSArICgxIHxCYXRjaCksIENpcmNhZGlhbl9STVJfRikpCgpDaXJjYWRpYW5fUk1SX00yIDwtIENpcmNhZGlhbl9STVJfTSAlPiUgCiAgZHBseXI6Om11dGF0ZShhbGxfcm1yX3Jlc2lkID0gcmVzaWR1YWxzKG1vZGVsX3Jlc3RfYWxsLnJtcl9tX3Jlc2lkKS9zaWdtYShtb2RlbF9yZXN0X2FsbC5ybXJfbV9yZXNpZCksIAogICAgICAgICAgICAgICAgZGFya19ybXJfcmVzaWQgPSByZXNpZHVhbHMobW9kZWxfcmVzdF9kYXJrLnJtcl9tX3Jlc2lkKS9zaWdtYShtb2RlbF9yZXN0X2Rhcmsucm1yX21fcmVzaWQpLAogICAgICAgICAgICAgICAgbGlnaHRfcm1yX3Jlc2lkID0gcmVzaWR1YWxzKG1vZGVsX3Jlc3RfbGlnaHQucm1yX21fcmVzaWQpL3NpZ21hKG1vZGVsX3Jlc3RfbGlnaHQucm1yX21fcmVzaWQpKQpDaXJjYWRpYW5fUk1SX0YyIDwtIENpcmNhZGlhbl9STVJfRiAlPiUgCiAgZHBseXI6Om11dGF0ZShhbGxfcm1yX3Jlc2lkID0gcmVzaWR1YWxzKG1vZGVsX3Jlc3RfYWxsLnJtcl9mX3Jlc2lkKS9zaWdtYShtb2RlbF9yZXN0X2FsbC5ybXJfZl9yZXNpZCksIAogICAgICAgICAgICAgICAgZGFya19ybXJfcmVzaWQgPSByZXNpZHVhbHMobW9kZWxfcmVzdF9kYXJrLnJtcl9mX3Jlc2lkKS9zaWdtYShtb2RlbF9yZXN0X2Rhcmsucm1yX2ZfcmVzaWQpLAogICAgICAgICAgICAgICAgbGlnaHRfcm1yX3Jlc2lkID0gcmVzaWR1YWxzKG1vZGVsX3Jlc3RfbGlnaHQucm1yX2ZfcmVzaWQpL3NpZ21hKG1vZGVsX3Jlc3RfbGlnaHQucm1yX2ZfcmVzaWQpKQoKQ2lyY2FkaWFuX3Jtcl9yZXNpZCA8LSByYmluZChDaXJjYWRpYW5fUk1SX00yLCBDaXJjYWRpYW5fUk1SX0YyKSAlPiUKICBkcGx5cjo6c2VsZWN0KE1vdXNlSUQsIGRhcmtfcm1yX3Jlc2lkLCBsaWdodF9ybXJfcmVzaWQsIGFsbF9ybXJfcmVzaWQpICU+JQogIGRwbHlyOjpyZW5hbWUoRGFyayA9IGRhcmtfcm1yX3Jlc2lkLCBMaWdodCA9IGxpZ2h0X3Jtcl9yZXNpZCwgQWxsID0gYWxsX3Jtcl9yZXNpZCkgJT4lCiAgdGlkeXI6OmdhdGhlcihDaXJjLCBtZWFuX3Jlc3RpbmdfbWV0YWJvbGljX3JhdGVfcmVzaWR1YWxzLCBEYXJrOkFsbCkgJT4lCiAgZHBseXI6OmxlZnRfam9pbihtZXRhZGF0YSwgYnkgPSBjKCJNb3VzZUlEIikpCgpGaWcyX3Jtcl9kYXJrX2xpZ2h0IDwtIENpcmNhZGlhbl9ybXJfcmVzaWQgJT4lIAogIGRwbHlyOjpmaWx0ZXIoQ2lyYyAhPSAiQWxsIikgJT4lIAogIGdncGxvdChhZXMoeCA9IENhdGVnb3J5LCB5ID0gbWVhbl9yZXN0aW5nX21ldGFib2xpY19yYXRlX3Jlc2lkdWFscywgc2hhcGUgPSBTZXgsIGNvbG9yID0gQ2F0ZWdvcnkpKSArIAogIGdlb21fcXVhc2lyYW5kb20oYWxwaGEgPSAwLjcsIHNpemUgPSAwLjc1KSArCiAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaXplPTIsIGFlcyhncm91cCA9IENhdGVnb3J5KSwgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNiwgc2hhcGUgPSAxNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9DYXRlZ29yeSwgbGFiZWwgPSBjKCJLaWxsZWQtQ00iLCAiTGl2ZS1DTSIpLCBuYW1lID0gIlRyZWF0bWVudCIpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gc2hhcGVfU2V4LCBsYWJlbCA9IGMoIkZlbWFsZSIsICJNYWxlIikpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJLaWxsZWQiID0gIktpbGxlZC1cbkNNIiwgIkxpdmUiID0gIkxpdmUtXG5DTSIpKSArCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxMCkgKwogIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSkgKwogICAgZmFjZXRfZ3JpZChTZXh+Q2lyYykgKyAKICB0aGVtZSgjc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgbGFicyh5PSJBZGouIHJlc3RpbmcgbWV0YWJvbGljIHJhdGUiKSAKRmlnMl9ybXJfZGFya19saWdodAoKRmlnUzNfcm1yX2FsbCA8LSBDaXJjYWRpYW5fcm1yX3Jlc2lkICU+JSAKICBkcGx5cjo6ZmlsdGVyKENpcmMgPT0gIkFsbCIpICU+JSAgCiAgZ2dwbG90KGFlcyh4ID0gQ2F0ZWdvcnksIHkgPSBtZWFuX3Jlc3RpbmdfbWV0YWJvbGljX3JhdGVfcmVzaWR1YWxzLCBzaGFwZSA9IFNleCwgY29sb3IgPSBDYXRlZ29yeSkpICsgCiAgZ2VvbV9xdWFzaXJhbmRvbShhbHBoYSA9IDAuNywgc2l6ZSA9IDAuNzUpICsKICBzdGF0X3N1bW1hcnkoZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNpemU9MiwgYWVzKGdyb3VwID0gQ2F0ZWdvcnkpLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC42LCBzaGFwZSA9IDE1KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX0NhdGVnb3J5LCBsYWJlbCA9IGMoIktpbGxlZC1DTSIsICJMaXZlLUNNIiksIG5hbWUgPSAiVHJlYXRtZW50IikgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBzaGFwZV9TZXgsIGxhYmVsID0gYygiRmVtYWxlIiwgIk1hbGUiKSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIktpbGxlZCIgPSAiS2lsbGVkLVxuQ00iLCAiTGl2ZSIgPSAiTGl2ZS1cbkNNIikpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDEwKSArCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKSArCiAgICBmYWNldF9ncmlkKC5+U2V4KSArIAogIHRoZW1lKHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgIHN0cmlwLnRleHQgPSBlbGVtZW50X2JsYW5rKCkpICsKICBsYWJzKHk9IkFkai4gcmVzdGluZyBtZXRhYm9saWMgcmF0ZSIpIApGaWdTM19ybXJfYWxsCmBgYAojIyMgRmlndXJlIDI6IEhpZ2hlciBwaHlzaWNhbCBhY3Rpdml0eSBhbmQgbWV0YWJvbGljIGVuZXJneSBleHBlbmRpdHVyZSBpbiBtaWNlIHdpdGggbGl2ZSBDLiBtaW51dGEKYGBge3J9CkZpZzJfbGVnZW5kIDwtIGNvd3Bsb3Q6OmdldF9sZWdlbmQobWV0YWRhdGFfQ21pbiAlPiUgCiAgZHBseXI6Om11dGF0ZShTZXggPSBpZmVsc2UoU2V4ID09ICJGIiwgIkZlbWFsZSIsICJNYWxlIiksIAogICAgICAgICAgICAgICAgQ2F0ZWdvcnkgPSBpZmVsc2UoQ2F0ZWdvcnkgPT0gIktpbGxlZCIsICJLaWxsZWQtQ00iLCAiTGl2ZS1DTSIpLCAKICAgICAgICAgICAgICAgIFNleF9DYXRlZ29yeSA9IHBhc3RlKFNleCwgQ2F0ZWdvcnksIHNlcCA9ICIgIikpICU+JQogIGdncGxvdChhZXMoeCA9IENhdGVnb3J5LCB5ID0gcVBDUl9DbWluX3Blcl9nQ0MsIHNoYXBlID0gU2V4X0NhdGVnb3J5LCBjb2xvciA9IFNleF9DYXRlZ29yeSkpICsgCiAgZ2VvbV9wb2ludChhZXMoc2hhcGUgPSBTZXhfQ2F0ZWdvcnksIGNvbG9yPSBTZXhfQ2F0ZWdvcnkpLCBhbHBoYSA9MC43LCBzaXplID0wLjUsIHNob3cubGVnZW5kID0gVCkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXM9YygxNiwgMTYsNCwgNCkpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKGNvbG9yX0NhdGVnb3J5LCBjb2xvcl9DYXRlZ29yeSkpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDEwKSArCiAgZ3VpZGVzKHNoYXBlID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDMsIGFscGhhID0gMSkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikpCgpGaWcyX2FsaWduXzEgPC0gY293cGxvdDo6YWxpZ25fcGxvdHMoRmlnMl9iZWFtX2JyZWFrcyArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWcyX2JiX2NtaW4gKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlnMl9iYl9mZSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWcyX2Rpc3RhbmNlICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiksICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlnMl9kaXN0YW5jZV9jbWluICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWcyX2ZlX2Rpc3RhbmNlICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduID0gJ2h2JywgYXhpcyA9ICd0YmxyJykKCkZpZzJfYWxpZ25fMiA8LSBjb3dwbG90OjphbGlnbl9wbG90cyhGaWcyX2VlX3dlaWdodCArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWcyX2VlX3Jlc2lkICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZzJfcm1yX2RhcmtfbGlnaHQgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSAnaHYnLCBheGlzID0gJ3RibHInKQoKCkZpZzJfMSA8LSBjb3dwbG90OjpwbG90X2dyaWQoTkEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWcyX2FsaWduXzFbWzFdXSwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlnMl9hbGlnbl8xW1syXV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlnMl9hbGlnbl8xW1szXV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlnMl9hbGlnbl8xW1s0XV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlnMl9hbGlnbl8xW1s1XV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlnMl9hbGlnbl8xW1s2XV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbD00LCBucm93PTIsIGxhYmVscyA9IGMoTkEsIkEiLCAiQyIsICJFIiwgTkEsICJCIiwgIkQiLCAiRiIpLCBsYWJlbF9zaXplID0gMTIsIHJlbF93aWR0aHMgPSBjKDAuMywgMSwgMS41LCAxLjUpLCByZWxfaGVpZ2h0cyA9IGMoMS4yLCAyKSkKCgpGaWcyXzIgPC0gY293cGxvdDo6cGxvdF9ncmlkKE5BLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZzJfYWxpZ25fMltbMV1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZzJfYWxpZ25fMltbMl1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZzJfYWxpZ25fMltbM11dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2w9NCwgbnJvdz0xLCBsYWJlbHMgPSBjKE5BLCAiRyIsICJIIiwgIkkiKSxsYWJlbF9zaXplID0gMTIsIHJlbF93aWR0aHMgPSBjKDAuMywgMS4yLCAxLCAxLjgpKQoKRmlndXJlMiA8LSBjb3dwbG90OjpwbG90X2dyaWQoRmlnMl8xLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWcyXzIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZzJfbGVnZW5kLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sPTEsIG5yb3c9MywgcmVsX2hlaWdodHMgPSBjKDMuMiwgMiwgMC4zKSkKYGBgCmBgYHtyIGZpZy53aWR0aD02LjUsIGZpZy5oZWlnaHQ9IDcuNX0KRmlndXJlMgpgYGAKYGBge3IgZXZhbCA9IEZBTFNFfQpnZ3NhdmUoIi4vRmlndXJlMi5wZGYiLCBwbG90ID0gRmlndXJlMiwgZGV2aWNlID0gY2Fpcm9fcGRmLCAgCiAgd2lkdGggPSAxNywKICBoZWlnaHQgPSAxOSwKICB1bml0cyA9ICJjbSIpCmBgYApGaWd1cmUgUzM6IE1vdXNlIHZvbHVudGFyeSBhY3Rpdml0eSBhbmQgYXZlcmFnZSByZXN0aW5nIG1ldGFib2xpYyByYXRlCmBgYHtyfQpGaWdTM19hbGlnbiA8LSBjb3dwbG90OjphbGlnbl9wbG90cyhGaWdTM19zcGVlZCArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZ1MzX3Jtcl9hbGwgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSAnaHYnLCBheGlzID0gJ3RibHInKQoKCkZpZ1MzXzEgPC0gY293cGxvdDo6cGxvdF9ncmlkKEZpZ1MzX2FsaWduW1sxXV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWdTM19hbGlnbltbMl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sPTIsIG5yb3c9MSwgbGFiZWxzID0gYygiQSIsICJCIiksIGxhYmVsX3NpemUgPSAxMiwgcmVsX3dpZHRocyA9IGMoMC45LCAxLjUpKQpGaWdTMyA8LSBjb3dwbG90OjpwbG90X2dyaWQoRmlnUzNfMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZzJfbGVnZW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sPTEsIG5yb3c9MiwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMSApKQpgYGAKYGBge3IgZmlnLndpZHRoPTMuNSwgZmlnLmhlaWdodD0gM30KRmlnUzMKYGBgCmBgYHtyIGV2YWwgPUZBTFNFfQpnZ3NhdmUoIi4vRmlnUzMucGRmIiwgcGxvdCA9IEZpZ1MzLCBkZXZpY2UgPSBjYWlyb19wZGYsICAKICB3aWR0aCA9IDksCiAgaGVpZ2h0ID0gNy41LAogIHVuaXRzID0gImNtIikKYGBgCgojIyBDLiBtaW51dGEgaW5jcmVhc2VzIGd1dCBtaWNyb2JpYWwgYmlvbWFzcyBhbmQgcmVtb2RlbHMgZGl2ZXJzaXR5CiMjIyBNaWNyb2JpYWwgYmlvbWFzcwpgYGB7cn0KRmlnM19xUENSX2JhY3RlcmlhIDwtIG1ldGFkYXRhX0NtaW4gJT4lIAogIGRwbHlyOjptdXRhdGUoU1FfcGVyX2dDQ19lMTAgPSBxUENSXzE2U19TUV9wZXJfZ0NDLzEwXjEwKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBDYXRlZ29yeSwgeSA9IFNRX3Blcl9nQ0NfZTEwLCBzaGFwZSA9IFNleCwgY29sb3IgPSBDYXRlZ29yeSkpICsgCiAgZ2VvbV9xdWFzaXJhbmRvbShhbHBoYSA9IDAuNywgc2l6ZSA9IDAuNzUpICsKICBzdGF0X3N1bW1hcnkoZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNpemU9MiwgYWVzKGdyb3VwID0gQ2F0ZWdvcnkpLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC42LCBzaGFwZSA9IDE1KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX0NhdGVnb3J5LCBsYWJlbCA9IGMoIktpbGxlZC1DTSIsICJMaXZlLUNNIiksIG5hbWUgPSAiVHJlYXRtZW50IikgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBzaGFwZV9TZXgsIGxhYmVsID0gYygiRmVtYWxlIiwgIk1hbGUiKSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIktpbGxlZCIgPSAiS2lsbGVkLVxuQ00iLCAiTGl2ZSIgPSAiTGl2ZS1cbkNNIikpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDEwKSArCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICBsYWJzKHkgPSBleHByZXNzaW9uKHBhc3RlKCJNaWNyb2JlcyAoR0UvZykgeCIsIGVeMTApKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpIApGaWczX3FQQ1JfYmFjdGVyaWEKYGBgCmBgYHtyfQpzZXQuc2VlZCg3NTkpCm1ldGFkYXRhX0NtaW4gPC0gbWV0YWRhdGFfQ21pbiAlPiUgCiAgZHBseXI6Om11dGF0ZShxUENSXzE2U19TUV9wZXJfZ0NDID0gYXMubnVtZXJpYyhxUENSXzE2U19TUV9wZXJfZ0NDKSwgCiAgICAgICAgICAgICAgICBxUENSXzE2U19TUV9wZXJfZ0NDX25vcm0gPSBwcmVkaWN0KGJlc3ROb3JtYWxpemUocVBDUl8xNlNfU1FfcGVyX2dDQykpKQoKb3B0aW9ucyhjb250cmFzdHM9YygiY29udHIuc3VtIiwgImNvbnRyLnBvbHkiKSkKbW9kZWxfYmlvbWFzczwtIGxtZXJUZXN0OjpsbWVyKHFQQ1JfMTZTX1NRX3Blcl9nQ0Nfbm9ybSB+IENhdGVnb3J5KlNleCArIFQ2X3dlaWdodCArIFBsYXRlICsgKDF8cVBDUl9Sb3VuZC9CYXRjaC9TZXgpLCBkYXRhID0gbWV0YWRhdGFfQ21pbikKbG1lclRlc3Q6OnN0ZXAobW9kZWxfYmlvbWFzcywga2VlcCA9ICJDYXRlZ29yeSIpCmBgYApgYGB7cn0KbW9kZWxfYmlvbWFzcy4yPC0gbG1lcihxUENSXzE2U19TUV9wZXJfZ0NDX25vcm0gfiBDYXRlZ29yeSArIFBsYXRlICsgKDEgfCBCYXRjaDpxUENSX1JvdW5kKSwgZGF0YSA9IG1ldGFkYXRhX0NtaW4pCgpzaGFwaXJvLnRlc3QocmVzaWR1YWxzKG1vZGVsX2Jpb21hc3MuMikpCmFub3ZhKGxtKHJlc2lkdWFscyhtb2RlbF9iaW9tYXNzLjIpIH4gZml0dGVkKG1vZGVsX2Jpb21hc3MuMikpKSAjIHRlc3QgZm9yIGhldGVyb3NjZWRhc3RpY2l0eSAKYGBgCmBgYHtyfQpwbG90KG1vZGVsX2Jpb21hc3MuMikKYGBgCmBgYHtyfQpjYXI6OkFub3ZhKG1vZGVsX2Jpb21hc3MuMiwgdHlwZSA9ICJJSSIsIHRlc3Quc3RhdGlzdGljID0iRiIpCmBgYApgYGB7cn0KbW9kZWxfYmlvbWFzcy5lZmY8LSBsbWVyKHFQQ1JfMTZTX1NRX3Blcl9nQ0N+IENhdGVnb3J5ICsgUGxhdGUgKyAoMSB8IEJhdGNoOnFQQ1JfUm91bmQpLCBkYXRhID0gbWV0YWRhdGFfQ21pbikKZWZmZWN0czo6ZWZmZWN0KCJDYXRlZ29yeSIsIG1vZGVsX2Jpb21hc3MuZWZmLCBzZSA9VFJVRSkgJT4lIGFzLmRhdGEuZnJhbWUKYGBgCiMjIyBDb3JybGVhdGlvbiBtaWNyb2JpYWwgYmlvbWFzcyB+IEMuIG1pbnV0YSAKYGBge3J9CkZpZzNfQ21pbl9iaW9tYXNzPC0gbWV0YWRhdGFfQ21pbiAlPiUKICBnZ3Bsb3QoYWVzKHg9IHFQQ1JfQ21pbl9wZXJfZ0NDX25vcm0gLHk9cVBDUl8xNlNfU1FfcGVyX2dDQ19ub3JtKSkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRiwgYWxwaGEgPSAwLjUsIHNpemUgPSAwLjUsIGNvbG9yID0iYmxhY2siKSsgCiAgZ2VvbV9wb2ludChhZXMoc2hhcGUgPSBTZXgsIGNvbG9yID1DYXRlZ29yeSksIGFscGhhID0wLjcsIHNpemUgPTAuNzUsIHNob3cubGVnZW5kID0gVCkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXM9c2hhcGVfU2V4LCBsYWJlbCA9IGMoIkZlbWFsZSIsICJNYWxlIiksbmFtZSA9ICJTZXgiKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9Y29sb3JfQ2F0ZWdvcnksIGxhYmVsID0gYyhleHByZXNzaW9uKGl0YWxpYygiS2lsbGVkLUNNIikpLCBleHByZXNzaW9uKGl0YWxpYygiTGl2ZS1DTSIpKSksIG5hbWUgPSAiVHJlYXRtZW50IikgKwogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTApICsKICBzdGF0X2NvcihtZXRob2QgPSAic3BlYXJtYW4iLCAgY29yLmNvZWYubmFtZSA9IGMoInJobyIpLCBzaXplID0gMykgKwogIGxhYnMoeSA9ICJOb3JtLiBNaWNyb2JlcyIsIHggPSAiTm9ybS4gQy4gbWludXRhIikKRmlnM19DbWluX2Jpb21hc3MKYGBgCiMjIyBNb2RpZmljYXRpb24gb2YgcHJvZmlsZWQgbWV0YWdlbm9taWMgZGF0YQpgYGB7ciBldmFsID0gRkFMU0V9CiMgVW5yYXJlZmllZCBPVFVzCnJlYWRzX3VucmFyZSA8LSBCcmFja2VuX290dV90YWJsZV9yZWFkcyAlPiUKICBkcGx5cjo6c2VsZWN0KE9UVV9JRCwgY29udGFpbnMoIkNDIiksICMgc2VsZWN0IG9ubHkgY2VjYWwgY29udGVudCBzYW1wbGVzCiAgICAgICAgICAgICAgICAtdGF4b25vbXksIC1jb250YWlucyhNZXRhZ2Vub21pY3NfZXhjbHVkZV9pZCkpICU+JSAKICBkcGx5cjo6cmVuYW1lKHJvd25hbWUgPSAiT1RVX0lEIikgJT4lIAogIHRpZHlyOjpnYXRoZXIodmFyLCB2YWx1ZSwgLXJvd25hbWUpICU+JSAKICB0aWR5cjo6c3ByZWFkKHJvd25hbWUsIHZhbHVlKSAlPiUKICB0aWJibGU6OmNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAidmFyIikgCgpuYW1lcyhyZWFkc191bnJhcmUpIDwtIHByb3BlckNvbG5hbWVzKHJlYWRzX3VucmFyZSkKCiMgUmFyZWZpZWQgT1RVcwpzZXQuc2VlZCgyKQpyZWFkc19yYXJlID0gcmVhZHNfdW5yYXJlICU+JSAKIEdVbmlGcmFjOjpSYXJlZnkoNDYwMDAwKQpyZWFkc19yYXJlID0gcmVhZHNfcmFyZSRvdHUudGFiLnJmZiAlPiUgCiAgYXMuZGF0YS5mcmFtZSgpCmBgYAojIyMgUmVhZHMgbm9ybWFsaXphdGlvbiBieSBtaWNyaW9iaWFsIGJpb21hc3MgKGFwcHJveGltYXRpb24gdG8gYWJzb2x1dGUgYWJ1bmRhbmNlKQpgYGB7ciBldmFsPUZBTFNFfQpyZWFkc19yYXJlX25vcm0gPC0gcmVhZHNfcmFyZSAlPiUKICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAicm93bmFtZSIpICU+JSAKICB0aWR5cjo6Z2F0aGVyKHZhciwgdmFsdWUsIC1yb3duYW1lKSAlPiUgCiAgdGlkeXI6OnNwcmVhZChyb3duYW1lLCB2YWx1ZSkgJT4lIAogIGRwbHlyOjpyZW5hbWUoT1RVX0lEID0gdmFyKSAKCnJlYWRzX3JhcmVfbm9ybVssMjoxODNdIDwtIGFzLmRhdGEudGFibGUobGFwcGx5KHJlYWRzX3JhcmVfbm9ybVssMjoxODNdLCBhcy5udW1lcmljKSkKCnJlYWRzX3JhcmVfbm9ybSA8LSByZWFkc19yYXJlX25vcm0gJT4lCiAgZHBseXI6OnJlbmFtZShyb3duYW1lID0gT1RVX0lEKSAlPiUKICBkcGx5cjo6bXV0YXRlX2lmKGlzLm51bWVyaWMsZnVuY3Rpb24oeCkgKHgvc3VtKHgpKSkgJT4lCiAgdGlkeXI6OmdhdGhlcih2YXIsIHZhbHVlLCAtcm93bmFtZSkgJT4lIAogIHRpZHlyOjpzcHJlYWQocm93bmFtZSwgdmFsdWUpICU+JSAKICBkcGx5cjo6cmVuYW1lKHNhbXBsZWlkID0gdmFyKSAlPiUKICBkcGx5cjo6bGVmdF9qb2luKE1ldGFnZW5vbWljc19tZXRhZGF0YV9DQywgYnkgPSJzYW1wbGVpZCIpICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4obWV0YWRhdGEsIGJ5ID0iTW91c2VJRCIpICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4ocVBDUl9kYXRhLCBieSA9Ik1vdXNlSUQiKSAlPiUKICBkcGx5cjo6bXV0YXRlKHFQQ1JfMTZTX1NRX3Blcl9nQ0MgPSBhcy5udW1lcmljKHFQQ1JfMTZTX1NRX3Blcl9nQ0MpKSAgJT4lCiAgZHBseXI6Omdyb3VwX2J5KHNhbXBsZWlkKSAlPiUKICBkcGx5cjo6bXV0YXRlX2VhY2goZnVucyguKnFQQ1JfMTZTX1NRX3Blcl9nQ0MpLCBzdGFydHNfd2l0aCgic19fIikpCgp3cml0ZS50YWJsZShyZWFkc19yYXJlX25vcm0sIGZpbGUgPSAiLi9kYXRhL0ludGVyaW1fb3V0cHV0L3JlYWRzX3JhcmVfbm9ybS50eHQiLHJvdy5uYW1lcz1GQUxTRSxzZXA9Ilx0IiwgcXVvdGUgPSBGQUxTRSkKYGBgCmBgYHtyfQpyZWFkc19yYXJlX25vcm08LSBmcmVhZCgiLi9kYXRhL0ludGVyaW1fb3V0cHV0L3JlYWRzX3JhcmVfbm9ybS50eHQiKSAKYGBgCiMjIyBUYXhhIGJhcnBsb3RzCmBgYHtyfQpUYXhvbm9teSA8LSBCcmFja2VuX290dV90YWJsZV9yZWFkcyAlPiUKICBkcGx5cjo6c2VsZWN0KE9UVV9JRCwgdGF4b25vbXkpICU+JQogIGRwbHlyOjptdXRhdGUodmFyID0gT1RVX0lEKSAKClRheG9ub215JHZhciA8LXByb3Blck5hbWVzKFRheG9ub215JHZhcikKVGF4b25vbXkkT1RVX0lEIDwtIGdzdWIoIiAiLCAiXyIsIFRheG9ub215JE9UVV9JRCkKYGBgCmBgYHtyfQpyZWFkc19yYXJlX25vcm1fbWV0YWRhdGEgPC0gcmVhZHNfcmFyZV9ub3JtICU+JQogIHRpYmJsZTo6Y29sdW1uX3RvX3Jvd25hbWVzKHZhciA9ICJzYW1wbGVpZCIpICU+JQogIGRwbHlyOjpzZWxlY3QoLWNvbnRhaW5zKCJzX18iKSkKCnJlYWRzX3JhcmVfbm9ybV9yZWFkcyA8LSByZWFkc19yYXJlX25vcm0gJT4lCiAgZHBseXI6OnNlbGVjdChzYW1wbGVpZCwgY29udGFpbnMoInNfXyIpKSAlPiUKICB0aWR5cjo6Z2F0aGVyKHZhciwgdmFsdWUsIC1zYW1wbGVpZCkgJT4lIAogIHRpZHlyOjpzcHJlYWQoc2FtcGxlaWQsIHZhbHVlKSAlPiUKICBkcGx5cjo6bXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kKSAlPiUKICB0aWJibGU6OmNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAidmFyIikKCiMgU2VwYXJhdGUgdGF4b25vbXkKdGF4X2xldmVscyA9IGMoIkRvbWFpbiIsICJQaHlsdW0iLCAiQ2xhc3MiLCAiT3JkZXIiLCAiRmFtaWx5IiwgIkdlbnVzIiwgIlNwZWNpZXMiKQojIEFsc28gbm90ZSB0aGF0IHRoZSB1bmNsYXNzaWZpZWQgcmVhZHMgZG8gbm90IGNvdW50IGZvciB0aGUgdG90YWwgc2VxIGNvdW50IQpgYGAKYGBge3J9Ck1GX2JyYWNrZW4gPC0gcmVhZHNfcmFyZV9ub3JtX3JlYWRzICU+JQogIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJ2YXIiKSAlPiUKICBkcGx5cjo6bXV0YXRlX2F0KGMoMjoxODMpLCBhcy5udW1lcmljKSAlPiUKICBkcGx5cjo6bGVmdF9qb2luKFRheG9ub215LCBieSA9InZhciIpICU+JSAKICBkcGx5cjo6cmVuYW1lKG5hbWUgPSB2YXIpICU+JSAKICBkcGx5cjo6ZmlsdGVyKG5hbWUgIT0gIlVuY2xhc3NpZmllZCIpICU+JSAKICB0aWR5cjo6c2VwYXJhdGUodGF4b25vbXksIGludG8gPSB0YXhfbGV2ZWxzLCBzZXAgPSAiOyIpIAoKIyBUb3RhbCBjb3VudHMgZm9yIHJlbGF0aXZlIGFidW5kYW5jZQpUb3RhbF9jb3VudHMgPSBNRl9icmFja2VuICU+JSAKICBkcGx5cjo6c2VsZWN0X2lmKGlzLm51bWVyaWMpICU+JSAKICBkcGx5cjo6c3VtbWFyaXNlX2FsbChzdW0pCgojIHN1bW1hcml6ZSBnZW51cwpUYXhhX2RmID0gTUZfYnJhY2tlbiAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoR2VudXMpICU+JSAKICBkcGx5cjo6c3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIHN1bSkgJT4lIAogIGRwbHlyOjp1bmdyb3VwKCkgJT4lIAogIGRwbHlyOjpyZW5hbWUoIlRheG9uIiA9ICJHZW51cyIpCgojIEJpbmQgdGFibGVzIGFuZCB0cmFuc2Zvcm0gdG8gcmVsYXRpdmUgYWJ1bmRhbmNlClRheGFfZGZfcmF3ID0gVGF4YV9kZiAlPiUgCiAgZHBseXI6OnJvd3dpc2UoKSAlPiUgCiAgZHBseXI6Om11dGF0ZShtZWFuX2FidW5kID0gbWVhbihjX2Fjcm9zcyh3aGVyZShpcy5udW1lcmljKSkpKSAKCiMgRmlsdGVyIHRheGEgd2l0aCBtZWFuIGFidW5kIDwgMC41ClRheGFfdmVjID0gVGF4YV9kZl9yYXcgJT4lIAogIGRwbHlyOjpmaWx0ZXIobWVhbl9hYnVuZCA+PSAxMDAwMDAwMDApICU+JSAKICBkcGx5cjo6cHVsbChUYXhvbikKCiMgQ3JlYXRlIGRmIG9mIGFidW5kYW50IHRheGEKQWJ1bmRhbnRfZGYgPSBUYXhhX2RmX3JhdyAlPiUgCiAgZHBseXI6OmZpbHRlcihUYXhvbiAlaW4lIFRheGFfdmVjKQoKIyBDb2xsYXBzZSByYXJlIHRheGEgaW50byAnb3RoZXInClJhcmVfZGYgPSBUYXhhX2RmX3JhdyAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBkcGx5cjo6ZmlsdGVyKCEoVGF4b24gJWluJSBUYXhhX3ZlYykpICU+JSAKICBkcGx5cjo6c3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIHN1bSkgJT4lIAogIGRwbHlyOjptdXRhdGUoVGF4b24gPSAiT3RoZXIiKSAlPiUgCiAgZHBseXI6OnNlbGVjdChUYXhvbiwgZXZlcnl0aGluZygpKQoKIyBKb2luIGFuZCBtZWx0ClRheGFfZGYuMiA9IGJpbmRfcm93cyhBYnVuZGFudF9kZiwgUmFyZV9kZikgJT4lIAogIGRwbHlyOjpzZWxlY3QoLW1lYW5fYWJ1bmQpICU+JSAKICB0aWR5cjo6cGl2b3RfbG9uZ2VyKGNvbHMgPSAtVGF4b24sIG5hbWVzX3RvID0gIlNhbXBsZSIsIHZhbHVlc190byA9ICJBYnVuZGFuY2UiKQpgYGAKYGBge3J9Cm1ldGFkYXRhX3RheGFfYmFycGxvdCA8LSBtZXRhZGF0YSAlPiUKICBkcGx5cjo6c2VsZWN0KE1vdXNlSUQsIENhdGVnb3J5LCBCYXRjaCkgJT4lCiAgZHBseXI6Omdyb3VwX2J5KENhdGVnb3J5LCBCYXRjaCkgJT4lCiAgZHBseXI6Om11dGF0ZShNb3VzZV9ucl9DYXRlZ29yeV9CYXRjaCA9IHJvd19udW1iZXIoKSkgJT4lCiAgZHBseXI6OnVuZ3JvdXAoKSAlPiUKICBkcGx5cjo6c2VsZWN0KE1vdXNlSUQsIE1vdXNlX25yX0NhdGVnb3J5X0JhdGNoKQoKVGF4YV9iYXJwbG90IDwtIHJlYWRzX3JhcmVfbm9ybV9tZXRhZGF0YSAlPiUKICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAiU2FtcGxlIikgJT4lCiAgZHBseXI6OmxlZnRfam9pbihUYXhhX2RmLjIsIGJ5ID0gIlNhbXBsZSIpICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4obWV0YWRhdGFfdGF4YV9iYXJwbG90LCBieSA9ICJNb3VzZUlEIikgJT4lCiAgZHBseXI6Om11dGF0ZShBYnVuZGFuY2UgPSBhcy5udW1lcmljKEFidW5kYW5jZSkpCmBgYApgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9Nn0KdGF4YWJhcnBsb3RfbGV2ZWxzIDwtIHJlYWRzX3JhcmVfbm9ybV9tZXRhZGF0YSAlPiUgCiAgZHBseXI6OmFycmFuZ2UoQ2F0ZWdvcnksIC1xUENSXzE2U19TUV9wZXJfZ0NDKSAlPiUKICBkcGx5cjo6cHVsbChNb3VzZUlEKQoKRmlnUzRfVGF4YV9iYXJwbG90PC0gVGF4YV9iYXJwbG90ICU+JQogIGRwbHlyOjptdXRhdGUoQWJ1bmRhbmNlID0gYXMubnVtZXJpYyhBYnVuZGFuY2UpKSAlPiUKICB0aWR5cjo6c2VwYXJhdGUoVGF4b24sIGludG8gPWMoTkEsICJUYXhvbiIpLCBzZXA9ICJfXyIpICU+JQogIGRwbHlyOjptdXRhdGUoVGF4b24gPSByZXBsYWNlX25hKFRheG9uLCAiT3RoZXIiKSkgJT4lCiAgZHBseXI6Om11dGF0ZShUYXhvbiA9IGZhY3RvcihUYXhvbiwgbGV2ZWxzID0gYygiQWxpc3RpcGVzIiwgIkJhY3Rlcm9pZGVzIiwgIkNPRTEiLCAiRWlzZW5iZXJnaWVsbGEiLCJFbnRlcm9jbG9zdGVyIiwgIkZsYXZvbmlmcmFjdG9yIiwgIlBhcmFiYWN0ZXJvaWRlcyIsICJQaG9jYWVpY29sYSIsICJSdXRoZW5pYmFjdGVyaXVtIiwgIlRvbHVtb25hcyIsICJPdGhlciIpKSkgJT4lCiAgZHBseXI6Om11dGF0ZShBYnVuZGFuY2VfMTB4MTAgPSBBYnVuZGFuY2UvMTBeMTApICU+JQogIGRwbHlyOjptdXRhdGUoQ2F0ZWdvcnkyID0gaWZlbHNlKENhdGVnb3J5ID09ICJLaWxsZWQiLCAiS2lsbGVkLUNNIiwgIkxpdmUtQ00iKSkgJT4lCiAgZ2dwbG90KGFlcyh4PWZhY3RvcihNb3VzZUlELCBsZXZlbHMgPSB0YXhhYmFycGxvdF9sZXZlbHMpLCB5PUFidW5kYW5jZV8xMHgxMCwgZmlsbD1UYXhvbikpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDEwKSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiMwMDAwMDAiLCAiI2I2ZGJmZiIsIiM5MjAwMDAiLCAiIzAwOTI5MiIsICIjZmZiNmRiIiwgIiNmZmZmNmQiLCAiI2RiNmQwMCIsICIjMDA2ZGRiIiwgIiMyNGZmMjQiLCAiI2ZmNmRiNiIsICIjMDA0OTQ5IiksIAogICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiR2VudXMiKSArCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCkpICsKICBjb29yZF9jYXJ0ZXNpYW4oY2xpcCA9ICJvZmYiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJyaWdodCIsIGxlZ2VuZC5rZXkuc2l6ZT11bml0KDAuNCwgImNtIiksCiAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpICsKICBnZ2g0eDo6ZmFjZXRfZ3JpZDIoU2V4fkNhdGVnb3J5Miwgc2NhbGVzID0gImZyZWVfeCIsIGluZGVwZW5kZW50ID0gIngiKSArCiAgZ3VpZGVzKGZpbGw9Z3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gInRvcCIpKSArCiAgbGFicyh5PSBleHByZXNzaW9uKHBhc3RlKCJNaWNyb2JlcyAoR0UvZykgeCIsIGVeMTApKSwgeCA9Ik1pY2UiKSArCiAgICB0aGVtZShzdHJpcC5iYWNrZ3JvdW5kLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF9ibGFuaygpKSAKRmlnUzRfVGF4YV9iYXJwbG90CmBgYAojIyMgYWxwaGEgYW5kIGJldGEgZGl2ZXJzaXR5IGluIHFpaW1lIHdpdGggYWJzb2x1dGUgc2VxdWVuY2VzCmBgYHtyIGV2YWwgPSBGQUxTRX0KZ2MoKQojIHByZXBhcmUgZmlsZQpxaWltZTJfcmVhZHNfcmFyZV9ub3JtPC0gcmVhZHNfcmFyZV9ub3JtICU+JQogIGRwbHlyOjpzZWxlY3Qoc2FtcGxlaWQsIGNvbnRhaW5zKCJzX18iKSkgJT4lCiAgZHBseXI6OnJlbmFtZShyb3duYW1lID0gc2FtcGxlaWQpICU+JSAKICB0aWR5cjo6Z2F0aGVyKHZhciwgdmFsdWUsIC1yb3duYW1lKSAlPiUgCiAgdGlkeXI6OnNwcmVhZChyb3duYW1lLCB2YWx1ZSkgJT4lCiAgZHBseXI6Omdyb3VwX2J5KHZhcikgJT4lCiAgZHBseXI6Om11dGF0ZShzdW1fYWJ1Ym5kID0gc3VtKGNfYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpKSkpICU+JQogIGRwbHlyOjpmaWx0ZXIoc3VtX2FidWJuZCA+IDApICU+JQogIGRwbHlyOjpzZWxlY3QoLXN1bV9hYnVibmQpICU+JQogIGRwbHlyOjp1bmdyb3VwKCkgJT4lCiAgZHBseXI6OmxlZnRfam9pbihUYXhvbm9teSwgYnkgPSJ2YXIiKSAlPiUKICBkcGx5cjo6c2VsZWN0KGNvbnRhaW5zKCJPVFUiKSwgY29udGFpbnMoIkNDIiksIHRheG9ub215KSAlPiUKICBkcGx5cjo6cmVuYW1lKCIjT1RVIElEIiA9IE9UVV9JRCkKZ2MoKQojc2F2ZSBvdXRwdXQKd3JpdGUudGFibGUocWlpbWUyX3JlYWRzX3JhcmVfbm9ybSwgZmlsZSA9ICIuL2RhdGEvSW50ZXJpbV9vdXRwdXQvcWlpbWUyX3JlYWRzX3JhcmVfbm9ybS50eHQiLCBzZXAgPSAiXHQiICwgcm93Lm5hbWVzID0gRkFMU0UsIHF1b3RlID0gRkFMU0UpCmBgYApgYGB7YmFzaCBldmFsPUZBTFNFfQpzb3VyY2UgYWN0aXZhdGUgL2ViaW8vYWJ0M19wcm9qZWN0cy9DaHJpc3RlbnNlbmVsbGFfQ00yMC9lbnZzL3FpaW1lMiAjcGF0aCB0byBxaWltZTItMjAyMi4yIGVudmlyb25tZW50CgojI3FpaW1lIGltcG9ydCBkYXRhCmJpb20gY29udmVydCAtaSAuL2RhdGEvSW50ZXJpbV9vdXRwdXQvcWlpbWUyX3JlYWRzX3JhcmVfbm9ybS50eHQgXAogICAgICAgICAgLW8gLi9kYXRhL0ludGVyaW1fb3V0cHV0L3FpaW1lMl9yZWFkc19yYXJlX25vcm0uYmlvbSBcCiAgICAgICAgICAtLXRvLWhkZjUgLS1wcm9jZXNzLW9icy1tZXRhZGF0YSB0YXhvbm9teSBcCiAgICAgICAgICAtLXRhYmxlLXR5cGUgIk9UVSB0YWJsZSIKCnFpaW1lIHRvb2xzIGltcG9ydCBcCiAgICAgICAgICAtLWlucHV0LXBhdGggLi9kYXRhL0ludGVyaW1fb3V0cHV0L3FpaW1lMl9yZWFkc19yYXJlX25vcm0uYmlvbSBcCiAgICAgICAgICAtLW91dHB1dC1wYXRoIC4vZGF0YS9JbnRlcmltX291dHB1dC9xaWltZTJfcmVhZHNfcmFyZV9ub3JtLnF6YSBcCiAgICAgICAgICAtLXR5cGUgJ0ZlYXR1cmVUYWJsZVtGcmVxdWVuY3ldJyBcCiAgICAgICAgICAtLWlucHV0LWZvcm1hdCBCSU9NVjIxMEZvcm1hdAoKIyNydW4gZGl2ZXJzaXR5CnFpaW1lIGRpdmVyc2l0eSBhbHBoYSBcCiAgICAgICAgICAtLXAtbWV0cmljIG9ic2VydmVkX2ZlYXR1cmVzIFwKICAgICAgICAgIC0taS10YWJsZSAuL2RhdGEvSW50ZXJpbV9vdXRwdXQvcWlpbWUyX3JlYWRzX3JhcmVfbm9ybS5xemEgXAogICAgICAgICAgLS1vLWFscGhhLWRpdmVyc2l0eSAuL2RhdGEvSW50ZXJpbV9vdXRwdXQvYWxwaGFfb2JzZXJ2ZWRfZmVhdHVyZXMucXphCgpxaWltZSBkaXZlcnNpdHkgYWxwaGEgXAogICAgICAgICAgLS1wLW1ldHJpYyBzaGFubm9uIFwKICAgICAgICAgIC0taS10YWJsZSAuL2RhdGEvSW50ZXJpbV9vdXRwdXQvcWlpbWUyX3JlYWRzX3JhcmVfbm9ybS5xemEgXAogICAgICAgICAgLS1vLWFscGhhLWRpdmVyc2l0eSAuL2RhdGEvSW50ZXJpbV9vdXRwdXQvYWxwaGFfc2hhbm5vbi5xemEKCnFpaW1lIGRpdmVyc2l0eSBhbHBoYSBcCiAgICAgICAgICAtLXAtbWV0cmljIHBpZWxvdV9lIFwKICAgICAgICAgIC0taS10YWJsZSAuL2RhdGEvSW50ZXJpbV9vdXRwdXQvcWlpbWUyX3JlYWRzX3JhcmVfbm9ybS5xemEgXAogICAgICAgICAgLS1vLWFscGhhLWRpdmVyc2l0eSAuL2RhdGEvSW50ZXJpbV9vdXRwdXQvYWxwaGFfcGllbG91LnF6YQogICAgICAgICAgCnFpaW1lIGRpdmVyc2l0eSBhbHBoYS1waHlsb2dlbmV0aWMgXAogICAgICAgICAgLS1wLW1ldHJpYyBmYWl0aF9wZCBcCiAgICAgICAgICAtLWktdGFibGUgLi9kYXRhL0ludGVyaW1fb3V0cHV0L3FpaW1lMl9yZWFkc19yYXJlX25vcm0ucXphIFwKICAgICAgICAgIC0taS1waHlsb2dlbnkgLi9kYXRhL01ldGFnZW5vbWljcy9yb290ZWRfdHJlZS5xemEgXAogICAgICAgICAgLS1vLWFscGhhLWRpdmVyc2l0eSAuL2RhdGEvSW50ZXJpbV9vdXRwdXQvYWxwaGFfZmFpdGhQRC5xemEKCgpxaWltZSBkaXZlcnNpdHkgYmV0YS1waHlsb2dlbmV0aWMgXAogICAgICAgICAgLS1wLW1ldHJpYyB3ZWlnaHRlZF91bmlmcmFjIFwKICAgICAgICAgIC0taS10YWJsZSAuL2RhdGEvSW50ZXJpbV9vdXRwdXQvcWlpbWUyX3JlYWRzX3JhcmVfbm9ybS5xemEgXAogICAgICAgICAgLS1pLXBoeWxvZ2VueSAuL2RhdGEvTWV0YWdlbm9taWNzL3Jvb3RlZF90cmVlLnF6YSBcCiAgICAgICAgICAtLW8tZGlzdGFuY2UtbWF0cml4IC4vZGF0YS9JbnRlcmltX291dHB1dC9iZXRhX3dVRi5xemEKCnFpaW1lIGRpdmVyc2l0eSBiZXRhLXBoeWxvZ2VuZXRpYyBcCiAgICAgICAgICAtLXAtbWV0cmljIHVud2VpZ2h0ZWRfdW5pZnJhYyBcCiAgICAgICAgICAtLWktdGFibGUgLi9kYXRhL0ludGVyaW1fb3V0cHV0L3FpaW1lMl9yZWFkc19yYXJlX25vcm0ucXphIFwKICAgICAgICAgIC0taS1waHlsb2dlbnkgLi9kYXRhL01ldGFnZW5vbWljcy9yb290ZWRfdHJlZS5xemEgXAogICAgICAgICAgLS1vLWRpc3RhbmNlLW1hdHJpeCAuL2RhdGEvSW50ZXJpbV9vdXRwdXQvYmV0YV91d1VGLnF6YQoKIyNleHBvcnQgZGF0YQpxaWltZSB0b29scyBleHBvcnQgXAogIC0taW5wdXQtcGF0aCAuL2RhdGEvSW50ZXJpbV9vdXRwdXQvYWxwaGFfb2JzZXJ2ZWRfZmVhdHVyZXMucXphIFwKICAtLW91dHB1dC1wYXRoIC4vZGF0YS9JbnRlcmltX291dHB1dC9hbHBoYV9vYnNlcnZlZF9mZWF0dXJlcwoKcWlpbWUgdG9vbHMgZXhwb3J0IFwKICAtLWlucHV0LXBhdGggLi9kYXRhL0ludGVyaW1fb3V0cHV0L2FscGhhX3NoYW5ub24ucXphIFwKICAtLW91dHB1dC1wYXRoIC4vZGF0YS9JbnRlcmltX291dHB1dC9hbHBoYV9zaGFubm9uCgpxaWltZSB0b29scyBleHBvcnQgXAogIC0taW5wdXQtcGF0aCAuL2RhdGEvSW50ZXJpbV9vdXRwdXQvYWxwaGFfcGllbG91LnF6YSBcCiAgLS1vdXRwdXQtcGF0aCAuL2RhdGEvSW50ZXJpbV9vdXRwdXQvYWxwaGFfcGllbG91CgpxaWltZSB0b29scyBleHBvcnQgXAogIC0taW5wdXQtcGF0aCAuL2RhdGEvSW50ZXJpbV9vdXRwdXQvYWxwaGFfZmFpdGhQRC5xemEgXAogIC0tb3V0cHV0LXBhdGggLi9kYXRhL0ludGVyaW1fb3V0cHV0L2FscGhhX2ZhaXRoUEQKCnFpaW1lIHRvb2xzIGV4cG9ydCBcCiAgLS1pbnB1dC1wYXRoIC4vZGF0YS9JbnRlcmltX291dHB1dC9iZXRhX3dVRi5xemEgXAogIC0tb3V0cHV0LXBhdGggLi9kYXRhL0ludGVyaW1fb3V0cHV0L2JldGFfd1VGCgpxaWltZSB0b29scyBleHBvcnQgXAogIC0taW5wdXQtcGF0aCAuL2RhdGEvSW50ZXJpbV9vdXRwdXQvYmV0YV91d1VGLnF6YSBcCiAgLS1vdXRwdXQtcGF0aCAuL2RhdGEvSW50ZXJpbV9vdXRwdXQvYmV0YV91d1VGCmBgYAojIyMjIGFscGhhIGRpdmVyc2l0eQpgYGB7cn0KQWxwaGFfRlBEIDwtIGZyZWFkKCIuL2RhdGEvSW50ZXJpbV9vdXRwdXQvYWxwaGFfZmFpdGhQRC9hbHBoYS1kaXZlcnNpdHkudHN2IikgJT4lCiAgZHBseXI6OnJlbmFtZShzYW1wbGVpZCA9ICIjU2FtcGxlSUQiKQpBbHBoYV9vYnNlcnZlZEYgPC0gZnJlYWQoIi4vZGF0YS9JbnRlcmltX291dHB1dC9hbHBoYV9vYnNlcnZlZF9mZWF0dXJlcy9hbHBoYS1kaXZlcnNpdHkudHN2IikgJT4lCiAgZHBseXI6OnJlbmFtZShzYW1wbGVpZCA9ICJWMSIpCkFscGhhX1MgPC0gZnJlYWQoIi4vZGF0YS9JbnRlcmltX291dHB1dC9hbHBoYV9zaGFubm9uL2FscGhhLWRpdmVyc2l0eS50c3YiKSAlPiUKICBkcGx5cjo6cmVuYW1lKHNhbXBsZWlkID0gIlYxIikKQWxwaGFfUCA8LSBmcmVhZCgiLi9kYXRhL0ludGVyaW1fb3V0cHV0L2FscGhhX3BpZWxvdS9hbHBoYS1kaXZlcnNpdHkudHN2IikgJT4lCiAgZHBseXI6OnJlbmFtZShzYW1wbGVpZCA9ICJWMSIpCiAgCkFscGhhX2RpdiA8LSBBbHBoYV9GUEQgJT4lCiAgZHBseXI6OmxlZnRfam9pbihBbHBoYV9vYnNlcnZlZEYsIGJ5ID0gInNhbXBsZWlkIikgJT4lCiAgZHBseXI6OmxlZnRfam9pbihBbHBoYV9TLCBieSA9ICJzYW1wbGVpZCIpICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4oQWxwaGFfUCwgYnkgPSAic2FtcGxlaWQiKSAlPiUKICBkcGx5cjo6bGVmdF9qb2luKE1ldGFnZW5vbWljc19tZXRhZGF0YV9DQywgYnkgPSAic2FtcGxlaWQiKSAlPiUKICBkcGx5cjo6ZmlsdGVyKCFncmVwbChwYXN0ZShNZXRhZ2Vub21pY3NfZXhjbHVkZV9pZCwgY29sbGFwc2U9InwiKSwgc2FtcGxlaWQpKSAlPiUKICBkcGx5cjo6bGVmdF9qb2luKG1ldGFkYXRhLCBieSA9ICJNb3VzZUlEIikKYGBgCmBgYHtyfQpGaWczX1NFIDwtIEFscGhhX2RpdiAlPiUKICBnZ3Bsb3QoYWVzKHggPSBDYXRlZ29yeSwgeSA9IHNoYW5ub25fZW50cm9weSwgc2hhcGUgPSBTZXgsIGNvbG9yID0gQ2F0ZWdvcnkpKSArIAogIGdlb21fcXVhc2lyYW5kb20oYWxwaGEgPSAwLjcsIHNpemUgPSAwLjc1KSArCiAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaXplPTIsIGFlcyhncm91cCA9IENhdGVnb3J5KSwgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNiwgc2hhcGUgPSAxNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9DYXRlZ29yeSwgbGFiZWwgPSBjKCJLaWxsZWQtQ00iLCAiTGl2ZS1DTSIpLCBuYW1lID0gIlRyZWF0bWVudCIpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gc2hhcGVfU2V4LCBsYWJlbCA9IGMoIkZlbWFsZSIsICJNYWxlIikpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJLaWxsZWQiID0gIktpbGxlZC1cbkNNIiwgIkxpdmUiID0gIkxpdmUtXG5DTSIpKSArCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxMCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0icmlnaHQiKSArCiAgbGFicyh5ID0gIlNoYW5ub24gRW50cm9weSIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKSArCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSkrCiAgZmFjZXRfZ3JpZCguflNleCkKRmlnM19TRQoKRmlnM19PRiA8LSBBbHBoYV9kaXYgJT4lCiAgZ2dwbG90KGFlcyh4ID0gQ2F0ZWdvcnksIHkgPSBvYnNlcnZlZF9mZWF0dXJlcywgc2hhcGUgPSBTZXgsIGNvbG9yID0gQ2F0ZWdvcnkpKSArIAogIGdlb21fcXVhc2lyYW5kb20oYWxwaGEgPSAwLjcsIHNpemUgPSAwLjc1KSArCiAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaXplPTIsIGFlcyhncm91cCA9IENhdGVnb3J5KSwgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNiwgc2hhcGUgPSAxNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9DYXRlZ29yeSwgbGFiZWwgPSBjKCJLaWxsZWQtQ00iLCAiTGl2ZS1DTSIpLCBuYW1lID0gIlRyZWF0bWVudCIpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gc2hhcGVfU2V4LCBsYWJlbCA9IGMoIkZlbWFsZSIsICJNYWxlIikpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJLaWxsZWQiID0gIktpbGxlZC1cbkNNIiwgIkxpdmUiID0gIkxpdmUtXG5DTSIpKSArCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxMCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0icmlnaHQiKSArCiAgbGFicyh5ID0gIiMgbWljcm9iaWFsIHNwZWNpZXMiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSkgKwogIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCkpKwogIGZhY2V0X2dyaWQoLn5TZXgpCkZpZzNfT0YKCkZpZ1M0X0ZEUCAgPC0gQWxwaGFfZGl2ICU+JQogIGdncGxvdChhZXMoeCA9IENhdGVnb3J5LCB5ID0gZmFpdGhfcGQsIHNoYXBlID0gU2V4LCBjb2xvciA9IENhdGVnb3J5KSkgKyAKICBnZW9tX3F1YXNpcmFuZG9tKGFscGhhID0gMC43LCBzaXplID0gMC43NSkgKwogIHN0YXRfc3VtbWFyeShmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2l6ZT0yLCBhZXMoZ3JvdXAgPSBDYXRlZ29yeSksIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjYsIHNoYXBlID0gMTUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JfQ2F0ZWdvcnksIGxhYmVsID0gYygiS2lsbGVkLUNNIiwgIkxpdmUtQ00iKSwgbmFtZSA9ICJUcmVhdG1lbnQiKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IHNoYXBlX1NleCwgbGFiZWwgPSBjKCJGZW1hbGUiLCAiTWFsZSIpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiS2lsbGVkIiA9ICJLaWxsZWQtXG5DTSIsICJMaXZlIiA9ICJMaXZlLVxuQ00iKSkgKwogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTApICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249InJpZ2h0IikgKwogIGxhYnMoeSA9ICJGYWl0aCdzIFBEIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpICsKICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpKSArCiAgZmFjZXRfZ3JpZCguflNleCkKRmlnUzRfRkRQIAoKRmlnUzRfUEUgIDwtIEFscGhhX2RpdiAlPiUKICBnZ3Bsb3QoYWVzKHggPSBDYXRlZ29yeSwgeSA9IHBpZWxvdV9ldmVubmVzcywgc2hhcGUgPSBTZXgsIGNvbG9yID0gQ2F0ZWdvcnkpKSArIAogIGdlb21fcXVhc2lyYW5kb20oYWxwaGEgPSAwLjcsIHNpemUgPSAwLjc1KSArCiAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaXplPTIsIGFlcyhncm91cCA9IENhdGVnb3J5KSwgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNiwgc2hhcGUgPSAxNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9DYXRlZ29yeSwgbGFiZWwgPSBjKCJLaWxsZWQtQ00iLCAiTGl2ZS1DTSIpLCBuYW1lID0gIlRyZWF0bWVudCIpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gc2hhcGVfU2V4LCBsYWJlbCA9IGMoIkZlbWFsZSIsICJNYWxlIikpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJLaWxsZWQiID0gIktpbGxlZC1cbkNNIiwgIkxpdmUiID0gIkxpdmUtXG5DTSIpKSArCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxMCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0icmlnaHQiKSArCiAgbGFicyh5ID0gIlBpbG91IGV2ZW5uZXNzIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpICsKICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpKSsKICBmYWNldF9ncmlkKC5+U2V4KQpGaWdTNF9QRSAKYGBgCndpbGNveC50ZXN0IGR1ZSB0byBwcm9ibGVtcyB3aXRoIG5vcm1hbGl0eSAKYGBge3J9Cm9wdGlvbnMoYmFja3VwX29wdGlvbnMpCkFscGhhX2Rpdl9NIDwtIEFscGhhX2RpdiAlPiUKICBkcGx5cjo6ZmlsdGVyKFNleCA9PSJNIikKQWxwaGFfZGl2X0YgPC0gQWxwaGFfZGl2ICU+JQogIGRwbHlyOjpmaWx0ZXIoU2V4ID09IkYiKQpgYGAKYGBge3J9CnByaW50KCJzZSBNIikKd2lsY294LnRlc3Qoc2hhbm5vbl9lbnRyb3B5fkNhdGVnb3J5LCBkYXRhID0gQWxwaGFfZGl2X00sIGV4YWN0ID0gRkFMU0UsIGNvcnJlY3QgPSBGQUxTRSwgY29uZi5pbnQgPSBGQUxTRSkKcHJpbnQoInNlIEYiKQp3aWxjb3gudGVzdChzaGFubm9uX2VudHJvcHl+Q2F0ZWdvcnksIGRhdGEgPSBBbHBoYV9kaXZfRiwgZXhhY3QgPSBGQUxTRSwgY29ycmVjdCA9IEZBTFNFLCBjb25mLmludCA9IEZBTFNFKQpwcmludCgicGUgTSIpCndpbGNveC50ZXN0KHBpZWxvdV9ldmVubmVzc35DYXRlZ29yeSwgZGF0YSA9IEFscGhhX2Rpdl9NLCBleGFjdCA9IEZBTFNFLCBjb3JyZWN0ID0gRkFMU0UsIGNvbmYuaW50ID0gRkFMU0UpCnByaW50KCJwZSBGIikKd2lsY294LnRlc3QocGllbG91X2V2ZW5uZXNzfkNhdGVnb3J5LCBkYXRhID0gQWxwaGFfZGl2X0YsIGV4YWN0ID0gRkFMU0UsIGNvcnJlY3QgPSBGQUxTRSwgY29uZi5pbnQgPSBGQUxTRSkKcHJpbnQoImZwZCBNIikKd2lsY294LnRlc3QoZmFpdGhfcGR+Q2F0ZWdvcnksIGRhdGEgPSBBbHBoYV9kaXZfTSwgZXhhY3QgPSBGQUxTRSwgY29ycmVjdCA9IEZBTFNFLCBjb25mLmludCA9IEZBTFNFKQpwcmludCgiZnBkIEYiKQp3aWxjb3gudGVzdChmYWl0aF9wZH5DYXRlZ29yeSwgZGF0YSA9IEFscGhhX2Rpdl9GLCBleGFjdCA9IEZBTFNFLCBjb3JyZWN0ID0gRkFMU0UsIGNvbmYuaW50ID0gRkFMU0UpCnByaW50KCJvZiBNIikKd2lsY294LnRlc3Qob2JzZXJ2ZWRfZmVhdHVyZXN+Q2F0ZWdvcnksIGRhdGEgPSBBbHBoYV9kaXZfTSwgZXhhY3QgPSBGQUxTRSwgY29ycmVjdCA9IEZBTFNFLCBjb25mLmludCA9IEZBTFNFKQpwcmludCgib2YgRiIpCndpbGNveC50ZXN0KG9ic2VydmVkX2ZlYXR1cmVzfkNhdGVnb3J5LCBkYXRhID0gQWxwaGFfZGl2X0YsIGV4YWN0ID0gRkFMU0UsIGNvcnJlY3QgPSBGQUxTRSwgY29uZi5pbnQgPSBGQUxTRSkKYGBgCmBgYHtyfQpzdGFuZGFyZF9lcnJvciA8LSBmdW5jdGlvbih4KSBzZCh4KSAvIHNxcnQobGVuZ3RoKHgpKQoKbWVhbl9zZV90cmVhdF9NIDwtIEFscGhhX2Rpdl9NICU+JQogIGRwbHlyOjpncm91cF9ieShDYXRlZ29yeSkgJT4lCiAgZHBseXI6OnN1bW1hcmlzZShtZWFuID0gbWVhbihzaGFubm9uX2VudHJvcHkpLCBzZSA9IHN0YW5kYXJkX2Vycm9yKHNoYW5ub25fZW50cm9weSkpJT4lCiAgZHBseXI6Om11dGF0ZShhbHBoYSA9ICJzZSIpCgptZWFuX3BlX3RyZWF0X00gPC0gQWxwaGFfZGl2X00gJT4lCiAgZHBseXI6Omdyb3VwX2J5KENhdGVnb3J5KSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKG1lYW4gPSBtZWFuKHBpZWxvdV9ldmVubmVzcyksIHNlID0gc3RhbmRhcmRfZXJyb3IocGllbG91X2V2ZW5uZXNzKSklPiUKICBkcGx5cjo6bXV0YXRlKGFscGhhID0gInBlIikKCm1lYW5fZmRwX3RyZWF0X00gPC0gQWxwaGFfZGl2X00lPiUKICBkcGx5cjo6Z3JvdXBfYnkoQ2F0ZWdvcnkpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UobWVhbiA9IG1lYW4oZmFpdGhfcGQpLCBzZSA9IHN0YW5kYXJkX2Vycm9yKGZhaXRoX3BkKSklPiUKICBkcGx5cjo6bXV0YXRlKGFscGhhID0gImZkcCIpCgptZWFuX29mX3RyZWF0X00gPC0gQWxwaGFfZGl2X00gJT4lCiAgZHBseXI6Omdyb3VwX2J5KENhdGVnb3J5KSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKG1lYW4gPSBtZWFuKG9ic2VydmVkX2ZlYXR1cmVzKSwgc2UgPSBzdGFuZGFyZF9lcnJvcihvYnNlcnZlZF9mZWF0dXJlcykpICU+JQogIGRwbHlyOjptdXRhdGUoYWxwaGEgPSAib2YiKQoKcmJpbmQobWVhbl9zZV90cmVhdF9NLCBtZWFuX3BlX3RyZWF0X00sIG1lYW5fZmRwX3RyZWF0X00sIG1lYW5fb2ZfdHJlYXRfTSkKYGBgCmBgYHtyfQptZWFuX3NlX3RyZWF0X0YgPC0gQWxwaGFfZGl2X0YgJT4lCiAgZHBseXI6Omdyb3VwX2J5KENhdGVnb3J5KSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKG1lYW4gPSBtZWFuKHNoYW5ub25fZW50cm9weSksIHNlID0gc3RhbmRhcmRfZXJyb3Ioc2hhbm5vbl9lbnRyb3B5KSklPiUKICBkcGx5cjo6bXV0YXRlKGFscGhhID0gInNlIikKCm1lYW5fcGVfdHJlYXRfRiA8LSBBbHBoYV9kaXZfRiAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoQ2F0ZWdvcnkpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UobWVhbiA9IG1lYW4ocGllbG91X2V2ZW5uZXNzKSwgc2UgPSBzdGFuZGFyZF9lcnJvcihwaWVsb3VfZXZlbm5lc3MpKSU+JQogIGRwbHlyOjptdXRhdGUoYWxwaGEgPSAicGUiKQoKbWVhbl9mZHBfdHJlYXRfRjwtIEFscGhhX2Rpdl9GJT4lCiAgZHBseXI6Omdyb3VwX2J5KENhdGVnb3J5KSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKG1lYW4gPSBtZWFuKGZhaXRoX3BkKSwgc2UgPSBzdGFuZGFyZF9lcnJvcihmYWl0aF9wZCkpJT4lCiAgZHBseXI6Om11dGF0ZShhbHBoYSA9ICJmZHAiKQoKbWVhbl9vZl90cmVhdF9GIDwtIEFscGhhX2Rpdl9GICU+JQogIGRwbHlyOjpncm91cF9ieShDYXRlZ29yeSkgJT4lCiAgZHBseXI6OnN1bW1hcmlzZShtZWFuID0gbWVhbihvYnNlcnZlZF9mZWF0dXJlcyksIHNlID0gc3RhbmRhcmRfZXJyb3Iob2JzZXJ2ZWRfZmVhdHVyZXMpKSAlPiUKICBkcGx5cjo6bXV0YXRlKGFscGhhID0gIm9mIikKCnJiaW5kKG1lYW5fc2VfdHJlYXRfRiwgbWVhbl9wZV90cmVhdF9GLCBtZWFuX2ZkcF90cmVhdF9GLCBtZWFuX29mX3RyZWF0X0YpCmBgYAojIyMjIGJldGEgZGl2ZXJzaXR5CmBgYHtyfQpCZXRhX3dVRiA8LSBmcmVhZCgiLi9kYXRhL0ludGVyaW1fb3V0cHV0L2JldGFfd1VGL2Rpc3RhbmNlLW1hdHJpeC50c3YiKQpCZXRhX3V3VUYgPC0gZnJlYWQoIi4vZGF0YS9JbnRlcmltX291dHB1dC9iZXRhX3V3VUYvZGlzdGFuY2UtbWF0cml4LnRzdiIpCgpCZXRhX3dVRi4yIDwtIEJldGFfd1VGICU+JQogIGRwbHlyOjpmaWx0ZXIoIWdyZXBsKHBhc3RlKE1ldGFnZW5vbWljc19leGNsdWRlX2lkLCBjb2xsYXBzZT0ifCIpLCBWMSkpICU+JQogIGRwbHlyOjpzZWxlY3QoLWNvbnRhaW5zKE1ldGFnZW5vbWljc19leGNsdWRlX2lkKSkgJT4lCiAgZHBseXI6OmFycmFuZ2UoVjEpICU+JQogIGRwbHlyOjpzZWxlY3Qob3JkZXIoY29sbmFtZXMoLikpKSAlPiUKICB0aWJibGU6OmNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAiVjEiKQoKQmV0YV91d1VGLjIgPC0gQmV0YV91d1VGICU+JQogIGRwbHlyOjpmaWx0ZXIoIWdyZXBsKHBhc3RlKE1ldGFnZW5vbWljc19leGNsdWRlX2lkLCBjb2xsYXBzZT0ifCIpLCBWMSkpICU+JQogIGRwbHlyOjpzZWxlY3QoLWNvbnRhaW5zKE1ldGFnZW5vbWljc19leGNsdWRlX2lkKSkgJT4lCiAgZHBseXI6OmFycmFuZ2UoVjEpICU+JQogIGRwbHlyOjpzZWxlY3Qob3JkZXIoY29sbmFtZXMoLikpKSAlPiUKICB0aWJibGU6OmNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAiVjEiKQoKcmVhZHNfcmFyZV9ub3JtX21ldGFkYXRhIDwtIHJlYWRzX3JhcmVfbm9ybV9tZXRhZGF0YVsgb3JkZXIocm93Lm5hbWVzKHJlYWRzX3JhcmVfbm9ybV9tZXRhZGF0YSkpLCBdIAoKcmVhZHNfcmFyZV9ub3JtX21ldGFkYXRhLm1lbHQgPC0gcmVhZHNfcmFyZV9ub3JtX21ldGFkYXRhICU+JSAKICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAic2FtcGxlaWQiKSAgJT4lCiAgZHBseXI6OnNlbGVjdChzYW1wbGVpZCwgQ2F0ZWdvcnksIFNleCkgJT4lCiAgICBtdXRhdGVfaWYoaXMuZmFjdG9yLGFzLmNoYXJhY3RlcikKCndVRl9tZWx0IDwtIG1lbHQoYXMubWF0cml4KEJldGFfd1VGLjIpKSAlPiUKICAgIGZpbHRlcihhcy5jaGFyYWN0ZXIoVmFyMSkgIT0gYXMuY2hhcmFjdGVyKFZhcjIpKSAlPiUKICAgIG11dGF0ZV9pZihpcy5mYWN0b3IsYXMuY2hhcmFjdGVyKQoKdXdVRl9tZWx0IDwtIG1lbHQoYXMubWF0cml4KEJldGFfdXdVRi4yKSkgJT4lCiAgICBmaWx0ZXIoYXMuY2hhcmFjdGVyKFZhcjEpICE9IGFzLmNoYXJhY3RlcihWYXIyKSkgJT4lCiAgICBtdXRhdGVfaWYoaXMuZmFjdG9yLGFzLmNoYXJhY3RlcikKCmNvbG5hbWVzKHJlYWRzX3JhcmVfbm9ybV9tZXRhZGF0YS5tZWx0KSA9IGMoIlZhcjEiLCAiQ2F0ZWdvcnkxIiwgIlNleDEiKQp3VUZfbWVsdCA9IGxlZnRfam9pbih3VUZfbWVsdCwgcmVhZHNfcmFyZV9ub3JtX21ldGFkYXRhLm1lbHQsIGJ5ID0gIlZhcjEiKQp1d1VGX21lbHQgPSBsZWZ0X2pvaW4odXdVRl9tZWx0LCByZWFkc19yYXJlX25vcm1fbWV0YWRhdGEubWVsdCwgYnkgPSAiVmFyMSIpCgpjb2xuYW1lcyhyZWFkc19yYXJlX25vcm1fbWV0YWRhdGEubWVsdCkgPSBjKCJWYXIyIiwgIkNhdGVnb3J5MiIsICJTZXgyIikKd1VGX21lbHQgPSBsZWZ0X2pvaW4od1VGX21lbHQsIHJlYWRzX3JhcmVfbm9ybV9tZXRhZGF0YS5tZWx0LCBieSA9ICJWYXIyIikKdXdVRl9tZWx0ID0gbGVmdF9qb2luKHV3VUZfbWVsdCwgcmVhZHNfcmFyZV9ub3JtX21ldGFkYXRhLm1lbHQsIGJ5ID0gIlZhcjIiKQpgYGAKYGBge3J9CnNldC5zZWVkKDc2NSkKCndVRl9tZWx0LjIgPC0gd1VGX21lbHQgJT4lCiAgZHBseXI6OmZpbHRlcihDYXRlZ29yeTEgPT0gQ2F0ZWdvcnkyLCBTZXgxID09IFNleDIpICU+JQogIGRwbHlyOjptdXRhdGUoQ2F0ZWdvcnkgPSBDYXRlZ29yeTEsIFNleCA9IFNleDEpCiMgSXNzdWUgY2FudCB1c2UgbGluYWVyIG1vZGVscyAtLT4gbm8gbm9ybWFsaXR5IGluIHJlc2lkdWFscyAKIyBJIHdpbGwgdXNlIHdpbGNveGVuIHJhbmsgc3VtIHRlc3QKd1VGX21lbHRfTTwtIHdVRl9tZWx0LjIgJT4lCiAgZHBseXI6OmZpbHRlcihTZXggPT0iTSIpCndVRl9tZWx0X0Y8LSB3VUZfbWVsdC4yICU+JQogIGRwbHlyOjpmaWx0ZXIoU2V4ID09IkYiKSAKCnByaW50KCJ3VUYgTSIpCndpbGNveC50ZXN0KHZhbHVlIH4gQ2F0ZWdvcnksIGRhdGEgPSB3VUZfbWVsdF9NLCBleGFjdCA9IEZBTFNFLCBjb3JyZWN0ID0gRkFMU0UpCnByaW50KCJ3VUYgRiIpCndpbGNveC50ZXN0KHZhbHVlIH4gQ2F0ZWdvcnksIGRhdGEgPSB3VUZfbWVsdF9GLCBleGFjdCA9IEZBTFNFLCBjb3JyZWN0ID0gRkFMU0UpCgoKdXdVRl9tZWx0LjIgPC0gdXdVRl9tZWx0ICU+JQogIGRwbHlyOjpmaWx0ZXIoQ2F0ZWdvcnkxID09IENhdGVnb3J5MiwgU2V4MSA9PSBTZXgyKSAlPiUKICBkcGx5cjo6bXV0YXRlKENhdGVnb3J5ID0gQ2F0ZWdvcnkxLCBTZXggPSBTZXgxKQojIElzc3VlIGNhbnQgdXNlIGxpbmFlciBtb2RlbHMgLS0+IG5vIG5vcm1hbGl0eSBpbiByZXNpZHVhbHMgCiMgSSB3aWxsIHVzZSB3aWxjb3hlbiByYW5rIHN1bSB0ZXN0CnV3VUZfbWVsdF9NPC0gdXdVRl9tZWx0LjIgJT4lCiAgZHBseXI6OmZpbHRlcihTZXggPT0iTSIpIAp1d1VGX21lbHRfRjwtIHV3VUZfbWVsdC4yICU+JQogIGRwbHlyOjpmaWx0ZXIoU2V4ID09IkYiKSAKCnByaW50KCJ1d1VGIE0iKQp3aWxjb3gudGVzdCh2YWx1ZSB+IENhdGVnb3J5LCBkYXRhID0gdXdVRl9tZWx0X00sIGV4YWN0ID0gRkFMU0UsIGNvcnJlY3QgPSBGQUxTRSkKcHJpbnQoInV3VUYgRiIpCiB3aWxjb3gudGVzdCh2YWx1ZSB+IENhdGVnb3J5LCBkYXRhID0gdXdVRl9tZWx0X0YsIGV4YWN0ID0gRkFMU0UsIGNvcnJlY3QgPSBGQUxTRSkgCgpgYGAKYGBge3J9CkZpZzNfd1VGIDwtIHdVRl9tZWx0LjIgJT4lCiAgZ2dwbG90KGFlcyh4ID0gQ2F0ZWdvcnksIHkgPSB2YWx1ZSwgZmlsbD1mYWN0b3IoQ2F0ZWdvcnkpKSkgKwogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTApICsKICBnZW9tX2JveHBsb3QoYWxwaGEgPTAuNywgb3V0bGllci5zaXplID0gMC4zLCBvdXRsaWVyLmFscGhhID0gMC41KSArCiAgI2ZhY2V0X2dyaWQofiBTZXgsIHNjYWxlcyA9ICJmcmVlIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jb2xvcl9DYXRlZ29yeSApKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIktpbGxlZCIgPSAiS2lsbGVkLVxuQ00iLCAiTGl2ZSIgPSAiTGl2ZS1cbkNNIikpICsKICBsYWJzKHkgPSAid2VpZ2h0ZWRcblVuaUZyYWMgZGlzdGFuY2VzIikgICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpLCBheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpKSsKICBmYWNldF9ncmlkKC5+U2V4KQpGaWczX3dVRgoKRmlnM191d1VGIDwtdXdVRl9tZWx0LjIgJT4lCiAgZ2dwbG90KGFlcyh4ID0gQ2F0ZWdvcnksIHkgPSB2YWx1ZSwgZmlsbD1mYWN0b3IoQ2F0ZWdvcnkpKSkgKwogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTApICsKICBnZW9tX2JveHBsb3QoYWxwaGEgPTAuNywgb3V0bGllci5zaXplID0gMC4zLCBvdXRsaWVyLmFscGhhID0gMC41KSArCiAgI2ZhY2V0X2dyaWQofiBTZXgsIHNjYWxlcyA9ICJmcmVlIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jb2xvcl9DYXRlZ29yeSApKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIktpbGxlZCIgPSAiS2lsbGVkLVxuQ00iLCAiTGl2ZSIgPSAiTGl2ZS1cbkNNIikpICsKICBsYWJzKHkgPSAidW53ZWlnaHRlZFxuVW5pRnJhYyBkaXN0YW5jZXMiKSAgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIiksIGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCkpKwogIGZhY2V0X2dyaWQoLn5TZXgpCkZpZzNfdXdVRgpgYGAKIyMjIERpZmZlcmVudGlhbCBBYnVuZGFuY2UgQW5hbHlzaXMKYGBge3IgZXZhbCA9RkxBU0V9CmdjKCkKIyBtZWRpYW4gYWJ1bmRhbmNlIEMuIG1pbnV0YSA9IDAuMDAwMTAxMDg3IC0+IDAuMDElIAp0aHJlc2hfbWVkaWFuIDwtIDAuMDAwMDEgI3RocmVzaG9sZCBtZWRpYW4gYWJ1bmRhbmNlICg9IG1lZGlhbiBhYnVuZGFuY2UgQy4gbWludXRhIC8gMTApCgpyZWFkc19yYXJlLjIgPC0gcmVhZHNfcmFyZSAlPiUKICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAicm93bmFtZSIpICU+JSAKICB0aWR5cjo6Z2F0aGVyKHZhciwgdmFsdWUsIC1yb3duYW1lKSAlPiUgCiAgdGlkeXI6OnNwcmVhZChyb3duYW1lLCB2YWx1ZSkgCgpyZWFkc19yYXJlLjJbLDI6MTgzXSA8LSBhcy5kYXRhLnRhYmxlKGxhcHBseShyZWFkc19yYXJlLjJbLDI6MTgzXSwgYXMubnVtZXJpYykpCgoKcmVhZHNfcmFyZV9GPC1yZWFkc19yYXJlLjIgJT4lCiAgZHBseXI6OnNlbGVjdCh2YXIsIGNvbnRhaW5zKCJmQiIpKSAlPiUKICBkcGx5cjo6cmVuYW1lKHJvd25hbWUgPSB2YXIpICU+JQogIGRwbHlyOjptdXRhdGVfaWYoaXMubnVtZXJpYyxmdW5jdGlvbih4KSAoeC9zdW0oeCkpKSAlPiUKICBkcGx5cjo6cm93d2lzZSgpICU+JQogIGRwbHlyOjptdXRhdGUobWVkaWFuX2FidW5kID0gbWVkaWFuKGNfYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpKSkpICU+JQogIGRwbHlyOjpmaWx0ZXIobWVkaWFuX2FidW5kID49IHRocmVzaF9tZWRpYW4pICU+JQogIGRwbHlyOjpzZWxlY3QoLW1lZGlhbl9hYnVuZCkgJT4lCiAgdGlkeXI6OmdhdGhlcih2YXIsIHZhbHVlLCAtcm93bmFtZSkgJT4lIAogIHRpZHlyOjpzcHJlYWQocm93bmFtZSwgdmFsdWUpICU+JSAKICBkcGx5cjo6cmVuYW1lKHNhbXBsZWlkID0gdmFyKSAlPiUKICBkcGx5cjo6bGVmdF9qb2luKE1ldGFnZW5vbWljc19tZXRhZGF0YV9DQywgYnkgPSJzYW1wbGVpZCIpICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4obWV0YWRhdGEsIGJ5ID0iTW91c2VJRCIpICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4ocVBDUl9kYXRhLCBieSA9Ik1vdXNlSUQiKSAlPiUKICBkcGx5cjo6bXV0YXRlKHFQQ1JfMTZTX1NRX3Blcl9nQ0MgPSBhcy5udW1lcmljKHFQQ1JfMTZTX1NRX3Blcl9nQ0MpKSAgJT4lCiAgZHBseXI6Omdyb3VwX2J5KHNhbXBsZWlkKSAlPiUKICBkcGx5cjo6bXV0YXRlX2VhY2goZnVucyguKnFQQ1JfMTZTX1NRX3Blcl9nQ0MpLCBzdGFydHNfd2l0aCgic19fIikpICU+JQogIGRwbHlyOjp1bmdyb3VwKCkgCgpNYWFzbGluX21ldGFkYXRhX0YgPC0gcmVhZHNfcmFyZV9GICU+JQogIGRwbHlyOjpzZWxlY3QoLWNvbnRhaW5zKCJzX18iKSkgJT4lIAogIHRpYmJsZTo6Y29sdW1uX3RvX3Jvd25hbWVzKHZhciA9ICJzYW1wbGVpZCIpCgpNYWFzbGluX3JlYWRzX0YgPC0gcmVhZHNfcmFyZV9GICU+JQogIGRwbHlyOjpzZWxlY3Qoc2FtcGxlaWQsIGNvbnRhaW5zKCJzX18iKSkgJT4lCiAgdGlkeXI6OmdhdGhlcih2YXIsIHZhbHVlLCAtc2FtcGxlaWQpICU+JSAKICB0aWR5cjo6c3ByZWFkKHNhbXBsZWlkLCB2YWx1ZSkgJT4lCiAgZHBseXI6Om11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCkgJT4lIAogIHRpYmJsZTo6Y29sdW1uX3RvX3Jvd25hbWVzKHZhciA9ICJ2YXIiKQoKcmVhZHNfcmFyZV9NPC1yZWFkc19yYXJlLjIgJT4lCiAgZHBseXI6OnNlbGVjdCh2YXIsIGNvbnRhaW5zKCJtQiIpKSAlPiUKICBkcGx5cjo6cmVuYW1lKHJvd25hbWUgPSB2YXIpICU+JQogIGRwbHlyOjptdXRhdGVfaWYoaXMubnVtZXJpYyxmdW5jdGlvbih4KSAoeC9zdW0oeCkpKSAlPiUKICBkcGx5cjo6cm93d2lzZSgpICU+JQogIGRwbHlyOjptdXRhdGUobWVkaWFuX2FidW5kID0gbWVkaWFuKGNfYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpKSkpICU+JQogIGRwbHlyOjpmaWx0ZXIobWVkaWFuX2FidW5kID49IHRocmVzaF9tZWRpYW4pICU+JQogIGRwbHlyOjpzZWxlY3QoLW1lZGlhbl9hYnVuZCkgJT4lCiAgdGlkeXI6OmdhdGhlcih2YXIsIHZhbHVlLCAtcm93bmFtZSkgJT4lIAogIHRpZHlyOjpzcHJlYWQocm93bmFtZSwgdmFsdWUpICU+JSAKICBkcGx5cjo6cmVuYW1lKHNhbXBsZWlkID0gdmFyKSAlPiUKICBkcGx5cjo6bGVmdF9qb2luKE1ldGFnZW5vbWljc19tZXRhZGF0YV9DQywgYnkgPSJzYW1wbGVpZCIpICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4obWV0YWRhdGEsIGJ5ID0iTW91c2VJRCIpICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4ocVBDUl9kYXRhLCBieSA9Ik1vdXNlSUQiKSAlPiUKICBkcGx5cjo6bXV0YXRlKHFQQ1JfMTZTX1NRX3Blcl9nQ0MgPSBhcy5udW1lcmljKHFQQ1JfMTZTX1NRX3Blcl9nQ0MpKSAgJT4lCiAgZHBseXI6Omdyb3VwX2J5KHNhbXBsZWlkKSAlPiUKICBkcGx5cjo6bXV0YXRlX2VhY2goZnVucyguKnFQQ1JfMTZTX1NRX3Blcl9nQ0MpLCBzdGFydHNfd2l0aCgic19fIikpICU+JQogIGRwbHlyOjp1bmdyb3VwKCkKCk1hYXNsaW5fbWV0YWRhdGFfTSAgPC0gcmVhZHNfcmFyZV9NICU+JQogIGRwbHlyOjpzZWxlY3QoLWNvbnRhaW5zKCJzX18iKSkgJT4lIAogIHRpYmJsZTo6Y29sdW1uX3RvX3Jvd25hbWVzKHZhciA9ICJzYW1wbGVpZCIpCgpNYWFzbGluX3JlYWRzX00gPC0gcmVhZHNfcmFyZV9NICU+JQogIGRwbHlyOjpzZWxlY3Qoc2FtcGxlaWQsIGNvbnRhaW5zKCJzX18iKSkgJT4lCiAgdGlkeXI6OmdhdGhlcih2YXIsIHZhbHVlLCAtc2FtcGxlaWQpICU+JSAKICB0aWR5cjo6c3ByZWFkKHNhbXBsZWlkLCB2YWx1ZSkgJT4lCiAgZHBseXI6Om11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCkgJT4lIAogIHRpYmJsZTo6Y29sdW1uX3RvX3Jvd25hbWVzKHZhciA9ICJ2YXIiKQpgYGAKYGBge3IgZXZhbD1GQUxTRX0KZ2MoKQpvcHRpb25zKGJhY2t1cF9vcHRpb25zKQoKQ00yMF9NYWFzbGluX3NwZWNpZXNfRl90cmVhdCA9IE1hYXNsaW4yKAogICAgaW5wdXRfZGF0YSA9IE1hYXNsaW5fcmVhZHNfRiwgCiAgICBpbnB1dF9tZXRhZGF0YSA9IE1hYXNsaW5fbWV0YWRhdGFfRiwgCiAgICBvdXRwdXQgPSAiLi9kYXRhL0ludGVyaW1fb3V0cHV0L01hYXNsaW5fc3BlY2llc19GX3RyZWF0IiwgCiAgICAgICAgZml4ZWRfZWZmZWN0cyA9IGMoIkNhdGVnb3J5IiwgIlJ1biIpLCAKICAgIHJhbmRvbV9lZmZlY3RzID0gYygiQmF0Y2giKSwKICAgIHJlZmVyZW5jZT0gYygiUnVuLFIxLUhpc2VxIiksCiAgICBtaW5fcHJldmFsZW5jZSA9IDAuNSwgCiAgICBtYXhfc2lnbmlmaWNhbmNlID0gMC4xLCAKICAgIHBsb3Rfc2NhdHRlciA9IEZBTFNFLCAKICAgIHBsb3RfaGVhdG1hcCA9IEZBTFNFKQoKQ00yMF9NYWFzbGluX3NwZWNpZXNfTV90cmVhdCA9IE1hYXNsaW4yKAogICAgaW5wdXRfZGF0YSA9IE1hYXNsaW5fcmVhZHNfTSwgCiAgICBpbnB1dF9tZXRhZGF0YSA9IE1hYXNsaW5fbWV0YWRhdGFfTSwgCiAgICBvdXRwdXQgPSAiLi9kYXRhL0ludGVyaW1fb3V0cHV0L01hYXNsaW5fc3BlY2llc19NX3RyZWF0IiwgCiAgICAgICAgZml4ZWRfZWZmZWN0cyA9IGMoIkNhdGVnb3J5IiwgIlJ1biIpLCAKICAgIHJhbmRvbV9lZmZlY3RzID0gYygiQmF0Y2giKSwKICAgIHJlZmVyZW5jZT0gYygiUnVuLFIxLUhpc2VxIiksCiAgICBtaW5fcHJldmFsZW5jZSA9IDAuNSwgCiAgICBtYXhfc2lnbmlmaWNhbmNlID0gMC4xLCAKICAgIHBsb3Rfc2NhdHRlciA9IEZBTFNFLCAKICAgIHBsb3RfaGVhdG1hcCA9IEZBTFNFKQpgYGAKYGBge3J9ClJlc3VsdHNfTWFhc0xpbl9GIDwtIGZyZWFkKCIuL2RhdGEvSW50ZXJpbV9vdXRwdXQvTWFhc2xpbl9zcGVjaWVzX0ZfdHJlYXQvYWxsX3Jlc3VsdHMudHN2IikgJT4lCiAgZHBseXI6OmZpbHRlcihtZXRhZGF0YSA9PSAiQ2F0ZWdvcnkiKSAlPiUKICBkcGx5cjo6bXV0YXRlKHF2YWwgPSBwLmFkanVzdChwdmFsLCBtZXRob2QgPSAiQkgiKSkgJT4lCiAgZHBseXI6OmFycmFuZ2UocXZhbCkgJT4lIAogIGRwbHlyOjptdXRhdGUoYW5hbHlzaXMgPSAiRiIpClJlc3VsdHNfTWFhc0xpbl9NIDwtIGZyZWFkKCIuL2RhdGEvSW50ZXJpbV9vdXRwdXQvTWFhc2xpbl9zcGVjaWVzX01fdHJlYXQvYWxsX3Jlc3VsdHMudHN2IikgJT4lCiAgZHBseXI6OmZpbHRlcihtZXRhZGF0YSA9PSAiQ2F0ZWdvcnkiKSAlPiUKICBkcGx5cjo6bXV0YXRlKHF2YWwgPSBwLmFkanVzdChwdmFsLCBtZXRob2QgPSAiQkgiKSkgJT4lCiAgZHBseXI6OmFycmFuZ2UocXZhbCkgJT4lIAogIGRwbHlyOjptdXRhdGUoYW5hbHlzaXMgPSAiTSIpCgpzaWdfc3BlY2llc190cmVhdF9GIDwtIFJlc3VsdHNfTWFhc0xpbl9GICU+JQogIGRwbHlyOjpmaWx0ZXIocXZhbCA8PSAwLjEgJiBhYnMoY29lZikgPj0gMSkgJT4lCiAgcHVsbChmZWF0dXJlKQpzaWdfc3BlY2llc190cmVhdF9NIDwtIFJlc3VsdHNfTWFhc0xpbl9NICU+JQogIGRwbHlyOjpmaWx0ZXIocXZhbCA8PSAwLjEgJiBhYnMoY29lZikgPj0gMSkgJT4lCiAgcHVsbChmZWF0dXJlKQoKc2lnX3NwZWNpZXNfdHJlYXRfY29tYmluZWQgPC0gdW5pcXVlKGMoc2lnX3NwZWNpZXNfdHJlYXRfRiwgc2lnX3NwZWNpZXNfdHJlYXRfTSkpIAoKUmVzdWx0c19NYWFzTGluX0NhdGVnb3J5X3NwZWNpZXNfY29tYmluZWQgPC0gcmJpbmQoUmVzdWx0c19NYWFzTGluX0YsIFJlc3VsdHNfTWFhc0xpbl9NKSAlPiUKICBkcGx5cjo6ZmlsdGVyKGdyZXBsKHBhc3RlKHNpZ19zcGVjaWVzX3RyZWF0X2NvbWJpbmVkLCBjb2xsYXBzZT0ifCIpLCBmZWF0dXJlKSkgJT4lCiAgZHBseXI6OnJlbmFtZSh2YXIgPSBmZWF0dXJlKSAlPiUKICBkcGx5cjo6bXV0YXRlKHZhciA9IHByb3Blck5hbWVzKHZhcikpICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4oVGF4b25vbXksIGJ5ID0idmFyIikgJT4lCiAgdGlkeXI6OnNlcGFyYXRlKHRheG9ub215LCBpbnRvID0gdGF4X2xldmVscywgc2VwID0iOyIpICU+JQogIGRwbHlyOjpzZWxlY3QoLXZhciwgLU9UVV9JRCkgJT4lCiAgZHBseXI6Om11dGF0ZShTcGVjaWVzID0gc3ViKCJzX18iLCAiIiwgU3BlY2llcykpICU+JQogIGRwbHlyOjptdXRhdGUoRmFtaWx5ID0gc3ViKCJmX18iLCAiIiwgRmFtaWx5KSkgJT4lCiAgZHBseXI6Om11dGF0ZShzdGFycyA9IGN1dChxdmFsLCBicmVha3M9YygtSW5mLCAwLjAwMSwgMC4wMSwgMC4xLCBJbmYpLCBsYWJlbD1jKCIqKioiLCAiKioiLCAiKiIsICIiKSkgKQpgYGAKYGBge3J9CkZpZzNfTWFhc2xpbi4xPC0gUmVzdWx0c19NYWFzTGluX0NhdGVnb3J5X3NwZWNpZXNfY29tYmluZWQgJT4lIAogIGFycmFuZ2UoZGVzYyhGYW1pbHkpLCBkZXNjKFNwZWNpZXMpKSAlPiUKICBtdXRhdGUoU3BlY2llcyA9IGZjdF9pbm9yZGVyKGZhY3RvcihTcGVjaWVzKSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9YW5hbHlzaXMsIHk9U3BlY2llcywgZmlsbD1jb2VmKSwgc2hvdy5sZWdlbmQgPSBUKSArIAogIGdlb21fdGlsZSgpICsgCiAgc2NhbGVfZmlsbF9ncmFkaWVudDIobG93PSIjRDcxOTFDIiwgbWlkPSJ3aGl0ZSIsIGhpZ2g9IiMyQzdCQjYiKSArIAogIGdlb21fdGV4dChhZXMobGFiZWw9c3RhcnMpLCBjb2xvciA9ICJibGFjayIsIHNpemU9MykgKyAKICBsYWJzKHk9TlVMTCwgeD1OVUxMLCBmaWxsPSJjb2VmIikgKyAKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDEwKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ3RvcCcpKwogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpICsKICB0aGVtZShsZWdlbmQua2V5LmhlaWdodCA9IHVuaXQoMC40LCAnY20nKSwgbGVnZW5kLmtleS53aWR0aCA9IHVuaXQoMC40LCAnY20nKSkgKwogIHNjYWxlX3lfZGlzY3JldGUocG9zaXRpb24gPSAicmlnaHQiKQoKRmlnM19NYWFzbGluLjIgPC0gIFJlc3VsdHNfTWFhc0xpbl9DYXRlZ29yeV9zcGVjaWVzX2NvbWJpbmVkICU+JQogIGFycmFuZ2UoZGVzYyhGYW1pbHkpLCBkZXNjKFNwZWNpZXMpKSAlPiUKICBtdXRhdGUoU3BlY2llcyA9IGZjdF9pbm9yZGVyKGZhY3RvcihTcGVjaWVzKSkpICU+JSAKICBnZ3Bsb3QoYWVzKHk9U3BlY2llcywgeD0wLjEsIGZpbGwgPSBGYW1pbHkpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gdGFibGVhdV9jb2xvcl9wYWwoJ1RhYmxlYXUgMjAnKSgxOSkpICsKICBnZW9tX3RpbGUoKSArCiAgdGhlbWVfdm9pZChiYXNlX3NpemUgPSAxMCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykKCkZpZzNfTWFhc2xpbi5sZWdlbmQgPC0gY293cGxvdDo6Z2V0X2xlZ2VuZChSZXN1bHRzX01hYXNMaW5fQ2F0ZWdvcnlfc3BlY2llc19jb21iaW5lZCAlPiUKICBhcnJhbmdlKGRlc2MoRmFtaWx5KSwgZGVzYyhTcGVjaWVzKSkgJT4lCiAgbXV0YXRlKFNwZWNpZXMgPSBmY3RfaW5vcmRlcihmYWN0b3IoU3BlY2llcykpKSAlPiUgCiAgZ2dwbG90KGFlcyh5PVNwZWNpZXMsIHg9MC4xLCBmaWxsID0gRmFtaWx5KSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHRhYmxlYXVfY29sb3JfcGFsKCdUYWJsZWF1IDIwJykoMTkpKSArCiAgZ2VvbV90aWxlKCkgKwogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTApICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbGVmdCcpICsKICBndWlkZXMoZmlsbD1ndWlkZV9sZWdlbmQobnJvdz05LCB0aXRsZS5wb3NpdGlvbj0idG9wIikpICsgCiAgdGhlbWUobGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjQsICdjbScpLCAKICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSkgKwogIGd1aWRlcyhmaWxsPWd1aWRlX2xlZ2VuZChucm93PTUsYnlyb3c9VFJVRSkpKQpgYGAKYGBge3J9CkZpZzNfTWFhc2xpbiA8LSBGaWczX01hYXNsaW4uMiArIEZpZzNfTWFhc2xpbi4xICArIHBsb3RfbGF5b3V0KHdpZHRocyA9IGMoMC4zLCAxKSkKRmlnM19NYWFzbGluCmBgYAojIyMgRmlndXJlIDMgLSBDLiBtaW51dGEgZWZmZWN0cyBvbiBndXQgbWljcm9iaW9tZSBiaW9tYXNzIGFuZCBkaXZlcnNpdHkuCmBgYHtyfQpGaWczX2xlZ2VuZF90cmVhdG1lbnRfc2V4IDwtIGNvd3Bsb3Q6OmdldF9sZWdlbmQobWV0YWRhdGFfQ21pbiAlPiUgCiAgZHBseXI6Om11dGF0ZShTZXggPSBpZmVsc2UoU2V4ID09ICJGIiwgIkZlbWFsZSIsICJNYWxlIiksIAogICAgICAgICAgICAgICAgQ2F0ZWdvcnkgPSBpZmVsc2UoQ2F0ZWdvcnkgPT0gIktpbGxlZCIsICJLaWxsZWQtQ00iLCAiTGl2ZS1DTSIpLCAKICAgICAgICAgICAgICAgIFNleF9DYXRlZ29yeSA9IHBhc3RlKFNleCwgQ2F0ZWdvcnksIHNlcCA9ICIgIikpICU+JQogIGdncGxvdChhZXMoeCA9IENhdGVnb3J5LCB5ID0gcVBDUl9DbWluX3Blcl9nQ0MsIHNoYXBlID0gU2V4X0NhdGVnb3J5LCBjb2xvciA9IFNleF9DYXRlZ29yeSkpICsgCiAgZ2VvbV9wb2ludChhZXMoc2hhcGUgPSBTZXhfQ2F0ZWdvcnksIGNvbG9yPSBTZXhfQ2F0ZWdvcnkpLCBhbHBoYSA9MC43LCBzaXplID0wLjUsIHNob3cubGVnZW5kID0gVCkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXM9YygxNiwgMTYsNCwgNCkpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKGNvbG9yX0NhdGVnb3J5LCBjb2xvcl9DYXRlZ29yeSkpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDEwKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKyAKICBndWlkZXMoc2hhcGU9Z3VpZGVfbGVnZW5kKG5yb3c9MiwgYnlyb3c9VFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZS5hZXMgPSBsaXN0KHNpemUgPSAzLCBhbHBoYSA9IDEpKSkpCgpGaWczX2FsaWduIDwtIGNvd3Bsb3Q6OmFsaWduX3Bsb3RzKEZpZzNfcVBDUl9iYWN0ZXJpYSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWczX0NtaW5fYmlvbWFzcyArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWczX09GICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZzNfU0UgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlnM193VUYgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlnM191d1VGICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduID0gJ2h2JywgYXhpcyA9ICdybGJ0JykKCkZpZzNfMSA8LSBjb3dwbG90OjpwbG90X2dyaWQoRmlnM19hbGlnbltbMV1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlnM19hbGlnbltbMl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlnM19hbGlnbltbM11dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlnM19hbGlnbltbNF1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlnM19hbGlnbltbNV1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlnM19hbGlnbltbNl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbD0yLCBucm93PTMsIGxhYmVscyA9IGMoICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIpLCBsYWJlbF9zaXplID0gMTIsIHJlbF93aWR0aHMgPSBjKDEsIDEpLCByZWxfaGVpZ2h0cyA9IGMoMSwgMSwgMSkpCgpGaWczXzIgPC0gY293cGxvdDo6cGxvdF9ncmlkKEZpZzNfbGVnZW5kX3RyZWF0bWVudF9zZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWczX01hYXNsaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWczX01hYXNsaW4ubGVnZW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbD0xLCBucm93PTMsIGxhYmVscyA9IGMoTkEsICJHIiwgTkEpLCBsYWJlbF9zaXplID0gMTIsIHJlbF9oZWlnaHRzID0gYygwLjIsIDEuNSwgMC41KSkKCkZpZ3VyZTMgPC0gY293cGxvdDo6cGxvdF9ncmlkKEZpZzNfMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWczXzIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbD0yLCBucm93PTEsIHJlbF93aWR0aHMgPSBjKDEuMywgMSkpCmBgYApgYGB7ciBmaWcud2lkdGg9Ni41LCBmaWcuaGVpZ2h0PSA1LjV9CkZpZ3VyZTMKYGBgCmBgYHtyIGV2YWwgPSBGQUxTRX0KZ2dzYXZlKCIuL0ZpZ3VyZTMucGRmIiwgcGxvdCA9IEZpZ3VyZTMsIGRldmljZSA9IGNhaXJvX3BkZiwgIAogIHdpZHRoID0gMTcgLAogIGhlaWdodCA9IDE0LAogIHVuaXRzID0gImNtIikKYGBgCiMjIyBGaWd1cmUgUzQgLSBDLiBtaW51dGEgYW1lbmRtZW50IHJlc3VsdGVkIGluIGxvd2VyIGNvbXBsZXhpdHkgaW4gbWFsZXMuCmBgYHtyfQpGaWdTNF9iYXJwbG90X2xlZ2VuZCA8LSBjb3dwbG90OjpnZXRfbGVnZW5kKEZpZ1M0X1RheGFfYmFycGxvdCArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikgKQpGaWdTNF9sZWdlbmRfdHJlYXRtZW50X3NleCA8LSBjb3dwbG90OjpnZXRfbGVnZW5kKG1ldGFkYXRhX0NtaW4gJT4lIAogIGRwbHlyOjptdXRhdGUoU2V4ID0gaWZlbHNlKFNleCA9PSAiRiIsICJGZW1hbGUiLCAiTWFsZSIpLCAKICAgICAgICAgICAgICAgIENhdGVnb3J5ID0gaWZlbHNlKENhdGVnb3J5ID09ICJLaWxsZWQiLCAiS2lsbGVkLUNNIiwgIkxpdmUtQ00iKSwgCiAgICAgICAgICAgICAgICBTZXhfQ2F0ZWdvcnkgPSBwYXN0ZShTZXgsIENhdGVnb3J5LCBzZXAgPSAiICIpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBDYXRlZ29yeSwgeSA9IHFQQ1JfQ21pbl9wZXJfZ0NDLCBzaGFwZSA9IFNleF9DYXRlZ29yeSwgY29sb3IgPSBTZXhfQ2F0ZWdvcnkpKSArIAogIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gU2V4X0NhdGVnb3J5LCBjb2xvcj0gU2V4X0NhdGVnb3J5KSwgYWxwaGEgPTAuNywgc2l6ZSA9MC41LCBzaG93LmxlZ2VuZCA9IFQpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzPWMoMTYsIDE2LDQsIDQpKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9Yyhjb2xvcl9DYXRlZ29yeSwgY29sb3JfQ2F0ZWdvcnkpKSArCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxMCkgKwogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsgCiAgZ3VpZGVzKHNoYXBlPWd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemUgPSAzLCBhbHBoYSA9IDEpKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikpCgpGaWdTNF9hbGlnbiA8LSBjb3dwbG90OjphbGlnbl9wbG90cyhGaWdTNF9GRFAgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlnUzRfUEUgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSAndicsIGF4aXMgPSAnbCcpCgpGaWdTNF8xIDwtIGNvd3Bsb3Q6OnBsb3RfZ3JpZChOQSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWdTNF9UYXhhX2JhcnBsb3QgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2w9MiwgbnJvdz0xLCByZWxfd2lkdGhzID0gYygwLjEsIDIpLCAgbGFiZWxzID0gYyggIkEiLCBOQSksIGxhYmVsX3NpemUgPSAxMikKCkZpZ1M0XzIgPC0gY293cGxvdDo6cGxvdF9ncmlkKEZpZ1M0X2FsaWduW1sxXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZ1M0X2FsaWduW1syXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2w9MiwgbnJvdz0xLCByZWxfd2lkdGhzID0gYygxLCAxKSwgIGxhYmVscyA9IGMoIkIiLCJDIiksIGxhYmVsX3NpemUgPSAxMikKCgpGaWd1cmVTNCA8LSBjb3dwbG90OjpwbG90X2dyaWQoRmlnUzRfMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWdTNF9iYXJwbG90X2xlZ2VuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlnUzRfMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWdTNF9sZWdlbmRfdHJlYXRtZW50X3NleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbD0xLCBucm93PTQsIHJlbF9oZWlnaHRzID0gYygxLjYsIDAuMzUsIDEsIDAuMikpCmBgYApgYGB7ciBmaWcud2lkdGg9NCwgZmlnLmhlaWdodD0gNX0KRmlndXJlUzQKYGBgCmBgYHtyIGV2YWwgPSBGQUxTRX0KZ2dzYXZlKCIuL0ZpZ3VyZVM0LnBkZiIsIHBsb3QgPSBGaWd1cmVTNCwgZGV2aWNlID0gY2Fpcm9fcGRmLCAgCiAgd2lkdGggPSAxMC41LAogIGhlaWdodCA9IDEzLAogIHVuaXRzID0gImNtIikKYGBgCiMjIEFtZW5kbWVudCBvZiBDLiBtaW51dGEgYWx0ZXJlZCB0aGUgaG9zdCBtZXRhYm9sb21lIAojIyMgU0NGQQpgYGB7cn0KR0NNU19TQ0ZBcy4yPC0gR0NNU19TQ0ZBcyAlPiUKICBkcGx5cjo6bGVmdF9qb2luKG1ldGFkYXRhLCBieSA9ICJNb3VzZUlEIikKCkZpZzRfdG90YWxTQ0ZBIDwtIEdDTVNfU0NGQXMuMiAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gQ2F0ZWdvcnksIHkgPSBUb3RhbF9TQ0ZBLCBzaGFwZSA9IFNleCwgY29sb3IgPSBDYXRlZ29yeSkpICsgCiAgZ2VvbV9xdWFzaXJhbmRvbShhbHBoYSA9IDAuNywgc2l6ZSA9IDAuNzUpICsKICBzdGF0X3N1bW1hcnkoZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNpemU9MiwgYWVzKGdyb3VwID0gQ2F0ZWdvcnkpLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC42LCBzaGFwZSA9IDE1KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX0NhdGVnb3J5LCBsYWJlbCA9IGMoIktpbGxlZC1DTSIsICJMaXZlLUNNIiksIG5hbWUgPSAiVHJlYXRtZW50IikgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBzaGFwZV9TZXgsIGxhYmVsID0gYygiRmVtYWxlIiwgIk1hbGUiKSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIktpbGxlZCIgPSAiS2lsbGVkLVxuQ00iLCAiTGl2ZSIgPSAiTGl2ZS1cbkNNIikpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDEwKSArCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICBsYWJzKHk9ICJUb3RhbCBTQ0ZBcyAobU0vZykiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSkgKwogIGZhY2V0X2dyaWQoLn5TZXgpICsKICB0aGVtZShzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLHN0cmlwLnRleHQgPSBlbGVtZW50X2JsYW5rKCkpIApGaWc0X3RvdGFsU0NGQQpgYGAKYGBge3J9CnNldC5zZWVkKDUwMSkKR0NNU19TQ0ZBcy4yJFRvdGFsX1NDRkFfbm9ybSA8LSBwcmVkaWN0KGJlc3ROb3JtYWxpemUoR0NNU19TQ0ZBcy4yJFRvdGFsX1NDRkEpKQoKb3B0aW9ucyhjb250cmFzdHM9YygiY29udHIuc3VtIiwgImNvbnRyLnBvbHkiKSkKbW9kZWxfc2NmYTwtIGxtZXIoVG90YWxfU0NGQV9ub3JtIH4gQ2F0ZWdvcnkqU2V4ICsgRXh0cmFjdGlvbl9yb3VuZCArIChDYXRlZ29yeXxTZXgvQmF0Y2gpICsgKENhdGVnb3J5fEJhdGNoKSArICgxfERlcml2KSwgZGF0YSA9IEdDTVNfU0NGQXMuMikKc3RlcChtb2RlbF9zY2ZhKQpgYGAKYGBge3J9Cm9wdGlvbnMoY29udHJhc3RzPWMoImNvbnRyLnN1bSIsICJjb250ci5wb2x5IikpCm1vZGVsX3NjZmEuMjwtIGxtKFRvdGFsX1NDRkFfbm9ybSB+IENhdGVnb3J5ICsgU2V4ICsgRXh0cmFjdGlvbl9yb3VuZCArIENhdGVnb3J5OlNleCwgZGF0YSA9IEdDTVNfU0NGQXMuMikKc2hhcGlyby50ZXN0KHJlc2lkdWFscyhtb2RlbF9zY2ZhLjIpKQphbm92YShsbShyZXNpZHVhbHMobW9kZWxfc2NmYS4yKX5maXR0ZWQudmFsdWVzKG1vZGVsX3NjZmEuMikpKQpgYGAKYGBge3J9CnBhcihtZnJvdz1jKDIsMikpCnBsb3QobW9kZWxfc2NmYS4yKQpgYGAKYGBge3J9CkdDTVNfU0NGQXNfTSA8LSBHQ01TX1NDRkFzLjIgJT4lIGRwbHlyOjpmaWx0ZXIoU2V4ID09Ik0iKQpHQ01TX1NDRkFzX0YgPC0gR0NNU19TQ0ZBcy4yICU+JSBkcGx5cjo6ZmlsdGVyKFNleCA9PSJGIikKCm1vZGVsX3NjZmFfbSA8LSBsbShUb3RhbF9TQ0ZBX25vcm0gfiBDYXRlZ29yeSArIEV4dHJhY3Rpb25fcm91bmQsIGRhdGEgPSBHQ01TX1NDRkFzX00pCm1vZGVsX3NjZmFfZiA8LSBsbShUb3RhbF9TQ0ZBX25vcm0gfiBDYXRlZ29yeSArIEV4dHJhY3Rpb25fcm91bmQsIGRhdGEgPSBHQ01TX1NDRkFzX0YpCgpzaGFwaXJvLnRlc3QocmVzaWR1YWxzKG1vZGVsX3NjZmFfbSkpCnNoYXBpcm8udGVzdChyZXNpZHVhbHMobW9kZWxfc2NmYV9mKSkKCmFub3ZhKGxtKHJlc2lkdWFscyhtb2RlbF9zY2ZhX20pfmZpdHRlZC52YWx1ZXMobW9kZWxfc2NmYV9tKSkpCmFub3ZhKGxtKHJlc2lkdWFscyhtb2RlbF9zY2ZhX2YpfmZpdHRlZC52YWx1ZXMobW9kZWxfc2NmYV9mKSkpCgpjYXI6OkFub3ZhKG1vZGVsX3NjZmFfbSwgdGVzdC5zdGF0aXN0aWM9IkYiLCB0eXBlID0gIklJIikKY2FyOjpBbm92YShtb2RlbF9zY2ZhX2YsIHRlc3Quc3RhdGlzdGljPSJGIiwgdHlwZSA9ICJJSSIpCgptb2RlbF9zY2ZhX21lZmYgPC0gbG0oVG90YWxfU0NGQSB+IENhdGVnb3J5ICsgRXh0cmFjdGlvbl9yb3VuZCwgZGF0YSA9IEdDTVNfU0NGQXNfTSkKbW9kZWxfc2NmYV9mZWZmIDwtIGxtKFRvdGFsX1NDRkEgfiBDYXRlZ29yeSArIEV4dHJhY3Rpb25fcm91bmQsIGRhdGEgPSBHQ01TX1NDRkFzX0YpCgplZmZlY3RzOjplZmZlY3QoIkNhdGVnb3J5IiwgbW9kZWxfc2NmYV9tZWZmLCBzZT1UUlVFKSAlPiUgYXMuZGF0YS5mcmFtZQplZmZlY3RzOjplZmZlY3QoIkNhdGVnb3J5IiwgbW9kZWxfc2NmYV9mZWZmLCBzZT1UUlVFKSAlPiUgYXMuZGF0YS5mcmFtZQpgYGAKYGBge3IgZXZhbCA9IEZBTFNFfQpTQ0ZBX0YgPC0gR0NNU19TQ0ZBcy4yICU+JSAKICBkcGx5cjo6ZmlsdGVyKFNleCA9PSJGIikgJT4lCiAgZHBseXI6OnNlbGVjdChNb3VzZUlELCBBY2V0YXRlOkNhcHJvYXRlLCBQcm9waW9uYXRlOlZhbGVyYXRlKSAlPiUKICB0aWJibGU6OmNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAiTW91c2VJRCIpIAoKU0NGQV9NIDwtIEdDTVNfU0NGQXMuMiAlPiUgCiAgZHBseXI6OmZpbHRlcihTZXggPT0iTSIpICU+JQogIGRwbHlyOjpzZWxlY3QoTW91c2VJRCwgQWNldGF0ZTpDYXByb2F0ZSwgUHJvcGlvbmF0ZTpWYWxlcmF0ZSkgJT4lCiAgdGliYmxlOjpjb2x1bW5fdG9fcm93bmFtZXModmFyID0gIk1vdXNlSUQiKSAKClNDRkFfRl9tZXRhIDwtIEdDTVNfU0NGQXMuMiAlPiUgCiAgZHBseXI6OmZpbHRlcihTZXggPT0iRiIpICU+JQogIHRpYmJsZTo6Y29sdW1uX3RvX3Jvd25hbWVzKHZhciA9ICJNb3VzZUlEIikgCgpTQ0ZBX01fbWV0YSA8LSBHQ01TX1NDRkFzLjIgJT4lIAogIGRwbHlyOjpmaWx0ZXIoU2V4ID09Ik0iKSAlPiUKICB0aWJibGU6OmNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAiTW91c2VJRCIpIAoKb3B0aW9ucyhiYWNrdXBfb3B0aW9ucykKClNDRkFfRiA9IE1hYXNsaW4yKAogICAgaW5wdXRfZGF0YSA9IFNDRkFfRiwgCiAgICBpbnB1dF9tZXRhZGF0YSA9IFNDRkFfRl9tZXRhLCAKICAgIG91dHB1dCA9ICIuL2RhdGEvSW50ZXJpbV9vdXRwdXQvU0NGQV9GIiwgCiAgICBmaXhlZF9lZmZlY3RzID0gYygiQ2F0ZWdvcnkiLCAiRXh0cmFjdGlvbl9yb3VuZCIpLAogICAgcmVmZXJlbmNlID0gYygiRXh0cmFjdGlvbl9yb3VuZCxFMSIpLAogICAgcmFuZG9tX2VmZmVjdHMgPSBjKCJCYXRjaCIpLCAKICAgIG1pbl9wcmV2YWxlbmNlID0gRkFMU0UsCiAgICBtaW5fYWJ1bmRhbmNlID0gRkFMU0UsCiAgICBtaW5fdmFyaWFuY2UgPSBGQUxTRSwgCiAgICBhbmFseXNpc19tZXRob2QgPSAiTE0iLCAKICAgIG1heF9zaWduaWZpY2FuY2UgPSAwLjEpCgpTQ0ZBX00gPSBNYWFzbGluMigKICAgIGlucHV0X2RhdGEgPSBTQ0ZBX00sIAogICAgaW5wdXRfbWV0YWRhdGEgPSBTQ0ZBX01fbWV0YSwgCiAgICBvdXRwdXQgPSAiLi9kYXRhL0ludGVyaW1fb3V0cHV0L1NDRkFfTSIsIAogICAgZml4ZWRfZWZmZWN0cyA9IGMoIkNhdGVnb3J5IiwgIkV4dHJhY3Rpb25fcm91bmQiKSwgCiAgICByZWZlcmVuY2UgPSBjKCJFeHRyYWN0aW9uX3JvdW5kLEUxIiksCiAgICByYW5kb21fZWZmZWN0cyA9IGMoIkJhdGNoIiksIAogICAgbWluX3ByZXZhbGVuY2UgPSBGQUxTRSwKICAgIG1pbl9hYnVuZGFuY2UgPSBGQUxTRSwKICAgIG1pbl92YXJpYW5jZSA9IEZBTFNFLAogICAgbWF4X3NpZ25pZmljYW5jZSA9IDAuMSkKYGBgCmBgYHtyfQpTQ0ZBX0ZfcmVzdWx0cyA8LSBmcmVhZCgiLi9kYXRhL0ludGVyaW1fb3V0cHV0L1NDRkFfRi9hbGxfcmVzdWx0cy50c3YiKQpTQ0ZBX01fcmVzdWx0cyA8LWZyZWFkKCIuL2RhdGEvSW50ZXJpbV9vdXRwdXQvU0NGQV9NL2FsbF9yZXN1bHRzLnRzdiIpCmBgYApgYGB7cn0KU0NGQV9GX3RyZWF0IDwtIFNDRkFfRl9yZXN1bHRzICU+JQogIGRwbHlyOjpmaWx0ZXIobWV0YWRhdGEgPT0gIkNhdGVnb3J5IikgJT4lCiAgZHBseXI6Om11dGF0ZShxdmFsMiA9IHAuYWRqdXN0KHB2YWwsIG1ldGhvZD0gIkJIIikpICU+JQogIGRwbHlyOjphcnJhbmdlKHF2YWwyKQoKU0NGQV9NX3RyZWF0IDwtU0NGQV9NX3Jlc3VsdHMgJT4lCiAgZHBseXI6OmZpbHRlcihtZXRhZGF0YSA9PSAiQ2F0ZWdvcnkiKSAlPiUKICBkcGx5cjo6bXV0YXRlKHF2YWwyID0gcC5hZGp1c3QocHZhbCwgbWV0aG9kPSAiQkgiKSkgJT4lCiAgZHBseXI6OmFycmFuZ2UocXZhbDIpIApgYGAKYGBge3J9ClNDRkFfRl90cmVhdApTQ0ZBX01fdHJlYXQKYGBgCmBgYHtyfQpGaWc0X2J1dHlyYXRlIDwtIEdDTVNfU0NGQXMuMiAlPiUKICBnZ3Bsb3QoYWVzKHggPSBDYXRlZ29yeSwgeSA9IEJ1dHlyYXRlLCBzaGFwZSA9IFNleCwgY29sb3IgPSBDYXRlZ29yeSkpICsgCiAgZ2VvbV9xdWFzaXJhbmRvbShhbHBoYSA9IDAuNywgc2l6ZSA9IDAuNzUpICsKICBzdGF0X3N1bW1hcnkoZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNpemU9MiwgYWVzKGdyb3VwID0gQ2F0ZWdvcnkpLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC42LCBzaGFwZSA9IDE1KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX0NhdGVnb3J5LCBsYWJlbCA9IGMoIktpbGxlZC1DTSIsICJMaXZlLUNNIiksIG5hbWUgPSAiVHJlYXRtZW50IikgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBzaGFwZV9TZXgsIGxhYmVsID0gYygiRmVtYWxlIiwgIk1hbGUiKSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIktpbGxlZCIgPSAiS2lsbGVkLVxuQ00iLCAiTGl2ZSIgPSAiTGl2ZS1cbkNNIikpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDEwKSArCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICBsYWJzKHk9ICJCdXR5cmF0ZSAobU0vZykiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSkgKwogIGZhY2V0X2dyaWQoLn5TZXgpICsKICB0aGVtZShzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLHN0cmlwLnRleHQgPSBlbGVtZW50X2JsYW5rKCkpIApGaWc0X2J1dHlyYXRlCgpGaWdTNV9TQ0ZBcyA8LSBHQ01TX1NDRkFzLjIgJT4lCiAgZHBseXI6Om11dGF0ZShTZXhfQ2F0ZWdvcnkgPXBhc3RlIChTZXgsIENhdGVnb3J5LCBzZXAgPSJfIikpICU+JQogIGRwbHlyOjpzZWxlY3QoQ2F0ZWdvcnksU2V4X0NhdGVnb3J5LCBCYXRjaCwgU2V4LCBBY2V0YXRlLCBQcm9waW9uYXRlLCBWYWxlcmF0ZSwgQ2Fwcm9hdGUpICU+JQogIHRpZHlyOjpnYXRoZXIoU0NGQSwgbWVhc3VyZW1lbnQsIGMoQWNldGF0ZTpDYXByb2F0ZSkpICU+JQogIGdncGxvdChhZXMoeCA9IENhdGVnb3J5LCB5ID0gbWVhc3VyZW1lbnQsIHNoYXBlID0gU2V4LCBjb2xvciA9IENhdGVnb3J5KSkgKyAKICBnZW9tX3F1YXNpcmFuZG9tKGFscGhhID0gMC43LCBzaXplID0gMC43NSkgKwogIHN0YXRfc3VtbWFyeShmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2l6ZT0yLCBhZXMoZ3JvdXAgPSBDYXRlZ29yeSksIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjYsIHNoYXBlID0gMTUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JfQ2F0ZWdvcnksIGxhYmVsID0gYygiS2lsbGVkLUNNIiwgIkxpdmUtQ00iKSwgbmFtZSA9ICJUcmVhdG1lbnQiKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IHNoYXBlX1NleCwgbGFiZWwgPSBjKCJGZW1hbGUiLCAiTWFsZSIpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiS2lsbGVkIiA9ICJLIiwgIkxpdmUiID0gIkwiKSkgKwogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTApICsKICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIGxhYnMoeSA9ICJDb25jLiAobU0vZykiKSArCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSkgKwogIGdnaDR4OjpmYWNldF9uZXN0ZWRfd3JhcCh+IFNDRkEgKyBTZXgsIHNjYWxlcyA9ImZyZWVfeSIsbmNvbCA9NCwgbGFiZWxsZXI9ZnVuY3Rpb24oeCkge3hbMV19KSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSkgKwogIHRoZW1lKHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCkpCkZpZ1M1X1NDRkFzCmBgYAoKCmBgYHtyfQpvcHRpb25zKGNvbnRyYXN0cz1jKCJjb250ci5zdW0iLCAiY29udHIucG9seSIpKQoKc2V0LnNlZWQoMTkzKQoKU0NGQV9hY3Rpdml0eSA8LSBQcm9tZXRoaW9uX2FjdGl2aXR5ICU+JQogIGRwbHlyOjpzZWxlY3QoTW91c2VJRCwgRGlzdGFuY2VfdHJhdmVsZWQsIEJlYW1fYnJlYWtzLCBQcm9tZXRoaW9uX0NhYmluZXQpICU+JSAKICBkcGx5cjo6bGVmdF9qb2luKEdDTVNfU0NGQXMuMiwgYnkgPSJNb3VzZUlEIikgJT4lIAogIGRyb3BfbmEoRGlzdGFuY2VfdHJhdmVsZWQsIFRvdGFsX1NDRkEpICU+JQogIGRwbHlyOjptdXRhdGUoRGlzdGFuY2VfdHJhdmVsZWRfbm9ybSA9IHByZWRpY3QoYmVzdE5vcm1hbGl6ZTo6Ym94Y294KERpc3RhbmNlX3RyYXZlbGVkKSksIAogICAgICAgICAgICAgICAgQmVhbV9icmVha3Nfbm9ybSA9IHByZWRpY3QoYmVzdE5vcm1hbGl6ZShCZWFtX2JyZWFrcykpLCAKICAgICAgICAgICAgICAgIFRvdGFsX1NDRkFfbm9ybSA9IHByZWRpY3QoYmVzdE5vcm1hbGl6ZShUb3RhbF9TQ0ZBKSksIAogICAgICAgICAgICAgICAgQnV0eXJhdGVfbm9ybSA9IHByZWRpY3QoYmVzdE5vcm1hbGl6ZShCdXR5cmF0ZSkpKQpgYGAKYGBge3J9Cm1vZGVsX3NjZmFfZGlzdCA8LSBsbWVyVGVzdDo6bG1lcihEaXN0YW5jZV90cmF2ZWxlZF9ub3JtIH4gVG90YWxfU0NGQV9ub3JtKkV4dHJhY3Rpb25fcm91bmQqU2V4ICArICgxfEJhdGNoKSwgZGF0YSA9IFNDRkFfYWN0aXZpdHkpCmxtZXJUZXN0OjpzdGVwKG1vZGVsX3NjZmFfZGlzdCkKCm1vZGVsX3NjZmFfYmIgPC0gbG1lclRlc3Q6OmxtZXIoQmVhbV9icmVha3Nfbm9ybSB+IFRvdGFsX1NDRkFfbm9ybSpFeHRyYWN0aW9uX3JvdW5kKlNleCAgKyAoMXxCYXRjaCksIGRhdGEgPSBTQ0ZBX2FjdGl2aXR5KQpsbWVyVGVzdDo6c3RlcChtb2RlbF9zY2ZhX2JiKQoKbW9kZWxfYmFfZGlzdCA8LSBsbWVyVGVzdDo6bG1lcihEaXN0YW5jZV90cmF2ZWxlZF9ub3JtIH4gQnV0eXJhdGVfbm9ybSpFeHRyYWN0aW9uX3JvdW5kKlNleCAgKyAoMXxCYXRjaCksIGRhdGEgPSBTQ0ZBX2FjdGl2aXR5KQpsbWVyVGVzdDo6c3RlcChtb2RlbF9iYV9kaXN0KQoKbW9kZWxfYmFfYmI8LSBsbWVyVGVzdDo6bG1lcihCZWFtX2JyZWFrc19ub3JtIH4gQnV0eXJhdGVfbm9ybSpFeHRyYWN0aW9uX3JvdW5kKlNleCAgKyAoMXxCYXRjaCksIGRhdGEgPSBTQ0ZBX2FjdGl2aXR5KQpsbWVyVGVzdDo6c3RlcChtb2RlbF9iYV9iYikKYGBgCi0+IE9ubHkgdG90YWwgU0NGQSBjb3JyZWxhdGUgdG8gYWN0aXZpdHkuIEJ1dHlyYXRlIGRvZXNudC4gCmBgYHtyfQpvcHRpb25zKGNvbnRyYXN0cz1jKCJjb250ci5zdW0iLCAiY29udHIucG9seSIpKQoKbW9kZWxfc2NmYV9kaXMuMiA8LSBsbWVyVGVzdDo6bG1lcihEaXN0YW5jZV90cmF2ZWxlZF9ub3JtIH4gVG90YWxfU0NGQV9ub3JtICsgU2V4ICsgKDEgfCBCYXRjaCksIGRhdGEgPSBTQ0ZBX2FjdGl2aXR5KQpzaGFwaXJvLnRlc3QocmVzaWR1YWxzKG1vZGVsX3NjZmFfZGlzLjIpKQphbm92YShsbShyZXNpZHVhbHMobW9kZWxfc2NmYV9kaXMuMil+Zml0dGVkLnZhbHVlcyhtb2RlbF9zY2ZhX2Rpcy4yKSkpCgptb2RlbF9zY2ZhX2JiLjIgPC0gbG1lclRlc3Q6OmxtZXIoQmVhbV9icmVha3Nfbm9ybSB+IFRvdGFsX1NDRkFfbm9ybSArIFNleCArICgxIHwgQmF0Y2gpLCBkYXRhID0gU0NGQV9hY3Rpdml0eSkKc2hhcGlyby50ZXN0KHJlc2lkdWFscyhtb2RlbF9zY2ZhX2JiLjIpKQphbm92YShsbShyZXNpZHVhbHMobW9kZWxfc2NmYV9iYi4yKX5maXR0ZWQudmFsdWVzKG1vZGVsX3NjZmFfYmIuMikpKQoKbW9kZWxfYmFfZGlzdC4yIDwtIGxtZXJUZXN0OjpsbWVyKERpc3RhbmNlX3RyYXZlbGVkX25vcm0gfiBCdXR5cmF0ZV9ub3JtICsgU2V4ICsgKDEgfCBCYXRjaCksIGRhdGEgPSBTQ0ZBX2FjdGl2aXR5KQpzaGFwaXJvLnRlc3QocmVzaWR1YWxzKG1vZGVsX2JhX2Rpc3QuMikpCmFub3ZhKGxtKHJlc2lkdWFscyhtb2RlbF9iYV9kaXN0LjIpfmZpdHRlZC52YWx1ZXMobW9kZWxfYmFfZGlzdC4yKSkpCgptb2RlbF9iYV9iYi4yIDwtIGxtZXJUZXN0OjpsbWVyKEJlYW1fYnJlYWtzX25vcm0gfiBCdXR5cmF0ZV9ub3JtICsgU2V4ICsgKDEgfCBCYXRjaCksIGRhdGEgPSBTQ0ZBX2FjdGl2aXR5KQpzaGFwaXJvLnRlc3QocmVzaWR1YWxzKG1vZGVsX2JhX2JiLjIpKQphbm92YShsbShyZXNpZHVhbHMobW9kZWxfYmFfYmIuMil+Zml0dGVkLnZhbHVlcyhtb2RlbF9iYV9iYi4yKSkpCmBgYApgYGB7cn0KcGxvdChtb2RlbF9zY2ZhX2Rpcy4yKQpwbG90KG1vZGVsX3NjZmFfYmIuMikKCnBsb3QobW9kZWxfYmFfZGlzdC4yKQpwbG90KG1vZGVsX2JhX2JiLjIpCmBgYApgYGB7cn0KY2FyOjpBbm92YShtb2RlbF9zY2ZhX2Rpcy4yLCB0ZXN0LnN0YXRpc3RpYyA9IkYiLCB0eXBlID0iSUkiKQpjYXI6OkFub3ZhKG1vZGVsX3NjZmFfYmIuMiwgdGVzdC5zdGF0aXN0aWMgPSJGIiwgdHlwZSA9IklJIikKY2FyOjpBbm92YShtb2RlbF9iYV9kaXN0LjIsIHRlc3Quc3RhdGlzdGljID0iRiIsIHR5cGUgPSJJSSIpCmNhcjo6QW5vdmEobW9kZWxfYmFfYmIuMiwgdGVzdC5zdGF0aXN0aWMgPSJGIiwgdHlwZSA9IklJIikKYGBgCmBgYHtyfQpzZXQuc2VlZCg3NjMpCnIyX21vZGVsX3NjZmFfZGlzX21hcjwtIHBhcnRSMihtb2RlbF9zY2ZhX2Rpcy4yLCBwYXJ0dmFycyA9IGMoIlRvdGFsX1NDRkFfbm9ybSIpLCBSMl90eXBlID0gIm1hcmdpbmFsIiwgbmJvb3QgPSAxMCkKcjJfbW9kZWxfc2NmYV9kaXNfbWFyJFIyICU+JSBkcGx5cjo6ZmlsdGVyKHRlcm0gPT0gIlRvdGFsX1NDRkFfbm9ybSIpICU+JSBkcGx5cjo6c2VsZWN0KGVzdGltYXRlKSAlPiUgcHVsbCgpCgpyMl9tb2RlbF9zY2ZhX2JiX21hciA8LSBwYXJ0UjIobW9kZWxfc2NmYV9iYi4yLCBwYXJ0dmFycyA9IGMoIlRvdGFsX1NDRkFfbm9ybSIpLCBSMl90eXBlID0gIm1hcmdpbmFsIiwgbmJvb3QgPSAxMCkKcjJfbW9kZWxfc2NmYV9iYl9tYXIkUjIgJT4lIGRwbHlyOjpmaWx0ZXIodGVybSA9PSAiVG90YWxfU0NGQV9ub3JtIikgJT4lIGRwbHlyOjpzZWxlY3QoZXN0aW1hdGUpICU+JSBwdWxsKCkKCnIyX21vZGVsX2JhX2Rpc3RfbWFyPC0gcGFydFIyKG1vZGVsX2JhX2Rpc3QuMiwgcGFydHZhcnMgPSBjKCJCdXR5cmF0ZV9ub3JtIiksIFIyX3R5cGUgPSAibWFyZ2luYWwiLCBuYm9vdCA9IDEwKQpyMl9tb2RlbF9iYV9kaXN0X21hciRSMiAlPiUgZHBseXI6OmZpbHRlcih0ZXJtID09ICJCdXR5cmF0ZV9ub3JtIikgJT4lIGRwbHlyOjpzZWxlY3QoZXN0aW1hdGUpICU+JSBwdWxsKCkKCnIyX21vZGVsX2JhX2JiX21hcjwtIHBhcnRSMihtb2RlbF9iYV9iYi4yLCBwYXJ0dmFycyA9IGMoIkJ1dHlyYXRlX25vcm0iKSwgUjJfdHlwZSA9ICJtYXJnaW5hbCIsIG5ib290ID0gMTApCnIyX21vZGVsX2JhX2JiX21hciRSMiAlPiUgZHBseXI6OmZpbHRlcih0ZXJtID09ICJCdXR5cmF0ZV9ub3JtIikgJT4lIGRwbHlyOjpzZWxlY3QoZXN0aW1hdGUpICU+JSBwdWxsKCkKCgojcmVzaWR1YWxzCm1vZGVsX2JhX3NjZmFfZGlzdF9yZXNpZCA8LSBsbWVyVGVzdDo6bG1lcihEaXN0YW5jZV90cmF2ZWxlZF9ub3JtIH4gIFNleCArICgxIHwgQmF0Y2gpLCBkYXRhID0gU0NGQV9hY3Rpdml0eSkKbW9kZWxfYmFfc2NmYV9iYl9yZXNpZCA8LSBsbWVyVGVzdDo6bG1lcihCZWFtX2JyZWFrc19ub3JtIH4gU2V4ICsgKDEgfCBCYXRjaCksIGRhdGEgPSBTQ0ZBX2FjdGl2aXR5KQoKU0NGQV9hY3Rpdml0eSA8LSBTQ0ZBX2FjdGl2aXR5ICU+JQogIGRwbHlyOjptdXRhdGUoRGlzdGFuY2VfdHJhdmVsZWRfcmVzaWQgPSByZXNpZHVhbHMobW9kZWxfYmFfc2NmYV9kaXN0X3Jlc2lkKS9zaWdtYShtb2RlbF9iYV9zY2ZhX2Rpc3RfcmVzaWQpLCAKICAgICAgICAgICAgICAgIEJlYW1fYnJlYWtzX3Jlc2lkID0gcmVzaWR1YWxzKG1vZGVsX2JhX3NjZmFfYmJfcmVzaWQpL3NpZ21hKG1vZGVsX2JhX3NjZmFfYmJfcmVzaWQpKQpgYGAKYGBge3J9CkZpZzRfdHNjZmFfZGlzdGFuY2UgPC0gU0NGQV9hY3Rpdml0eSAlPiUKICBnZ3Bsb3QoYWVzKHg9IFRvdGFsX1NDRkFfbm9ybSAseT1EaXN0YW5jZV90cmF2ZWxlZF9yZXNpZCkpICsKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IFNleCwgY29sb3IgPSBDYXRlZ29yeSksIGFscGhhID0wLjcsIHNpemUgPTAuNiwgc2hvdy5sZWdlbmQgPSBUKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1zaGFwZV9TZXgsIGxhYmVsID0gYygiRmVtYWxlIiwgIk1hbGUiKSxuYW1lID0gIlNleCIpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jb2xvcl9DYXRlZ29yeSwgbGFiZWwgPSBjKGV4cHJlc3Npb24oaXRhbGljKCJLaWxsZWQtQ00iKSksIGV4cHJlc3Npb24oaXRhbGljKCJMaXZlLUNNIikpKSwgbmFtZSA9ICJUcmVhdG1lbnQiKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGLCAgYWxwaGEgPSAwLjgsIHNpemUgPSAwLjUsIGNvbG9yID0gImJsYWNrIikrIAogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTApICsKICBsYWJzKHk9ICJBZGouIGRpc3RhbmNlIHRyYXZlbGVkIiwgeCA9ICJOb3JtLiB0b3RhbCBTQ0ZBcyIpCkZpZzRfdHNjZmFfZGlzdGFuY2UKCkZpZ1M1X2J1dHlyYXRlX2JlYW1icmVha3M8LSBTQ0ZBX2FjdGl2aXR5JT4lCiAgZ2dwbG90KGFlcyh4PSBCdXR5cmF0ZV9ub3JtICx5PUJlYW1fYnJlYWtzX3Jlc2lkKSkgKwogIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gU2V4LCBjb2xvciA9IENhdGVnb3J5KSwgYWxwaGEgPTAuNywgc2l6ZSA9MC43NSwgc2hvdy5sZWdlbmQgPSBUKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1zaGFwZV9TZXgsIGxhYmVsID0gYygiRmVtYWxlIiwgIk1hbGUiKSxuYW1lID0gIlNleCIpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jb2xvcl9DYXRlZ29yeSwgbGFiZWwgPSBjKGV4cHJlc3Npb24oaXRhbGljKCJLaWxsZWQtQ00iKSksIGV4cHJlc3Npb24oaXRhbGljKCJMaXZlLUNNIikpKSwgbmFtZSA9ICJUcmVhdG1lbnQiKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGLCAgYWxwaGEgPSAwLjgsIHNpemUgPSAwLjUsIGNvbG9yID0gImJsYWNrIikrIAogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTApICsKICBsYWJzKHk9ICJBZGouIGJlYW0gYnJlYWtzIiwgeCA9ICJOb3JtLiBidXR5cmF0ZSIpCkZpZ1M1X2J1dHlyYXRlX2JlYW1icmVha3MKCkZpZ1M1X3RzY2ZhX2JlYW1icmVha3MgPC0gU0NGQV9hY3Rpdml0eSU+JQogIGdncGxvdChhZXMoeD0gVG90YWxfU0NGQV9ub3JtICx5PUJlYW1fYnJlYWtzX3Jlc2lkKSkgKwogIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gU2V4LCBjb2xvciA9IENhdGVnb3J5KSwgYWxwaGEgPTAuNywgc2l6ZSA9MC42LCBzaG93LmxlZ2VuZCA9IFQpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzPXNoYXBlX1NleCwgbGFiZWwgPSBjKCJGZW1hbGUiLCAiTWFsZSIpLG5hbWUgPSAiU2V4IikgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWNvbG9yX0NhdGVnb3J5LCBsYWJlbCA9IGMoZXhwcmVzc2lvbihpdGFsaWMoIktpbGxlZC1DTSIpKSwgZXhwcmVzc2lvbihpdGFsaWMoIkxpdmUtQ00iKSkpLCBuYW1lID0gIlRyZWF0bWVudCIpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEYsICBhbHBoYSA9IDAuOCwgc2l6ZSA9IDAuNSwgY29sb3IgPSAiYmxhY2siKSsgCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxMCkgKwogIGxhYnMoeT0gIkFkai4gYmVhbSBicmVha3MiLCB4ID0gIk5vcm0uIHRvdGFsIFNDRkEiKQpGaWdTNV90c2NmYV9iZWFtYnJlYWtzCgpGaWc0X2J1dHlyYXRlX2Rpc3RhbmNlIDwtIFNDRkFfYWN0aXZpdHkgJT4lCiAgZ2dwbG90KGFlcyh4PSBCdXR5cmF0ZV9ub3JtICx5PURpc3RhbmNlX3RyYXZlbGVkX3Jlc2lkKSkgKwogIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gU2V4LCBjb2xvciA9IENhdGVnb3J5KSwgYWxwaGEgPTAuNywgc2l6ZSA9MC42LCBzaG93LmxlZ2VuZCA9IFQpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzPXNoYXBlX1NleCwgbGFiZWwgPSBjKCJGZW1hbGUiLCAiTWFsZSIpLG5hbWUgPSAiU2V4IikgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWNvbG9yX0NhdGVnb3J5LCBsYWJlbCA9IGMoZXhwcmVzc2lvbihpdGFsaWMoIktpbGxlZC1DTSIpKSwgZXhwcmVzc2lvbihpdGFsaWMoIkxpdmUtQ00iKSkpLCBuYW1lID0gIlRyZWF0bWVudCIpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEYsICBhbHBoYSA9IDAuOCwgc2l6ZSA9IDAuNSwgY29sb3IgPSAiYmxhY2siKSsgCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxMCkgKwogIGxhYnMoeT0gIkFkai4gZGlzdGFuY2UgdHJhdmVsZWQiLCB4ID0gIk5vcm0uIGJ1dHlyYXRlIikgCkZpZzRfYnV0eXJhdGVfZGlzdGFuY2UKYGBgCiMjIyB0YXJnZXRlZCBzZXJ1bSBtZXRhYm9saXRlcyAoTENfTVMpCmBgYHtyfQpMQ01TX3NlcnVtLjIgPC0gTENNU19zZXJ1bSAlPiUKICBkcGx5cjo6ZmlsdGVyKFNhbXBsZXR5cGUgPT0gIlNhbXBsZSIpICU+JQogIGRwbHlyOjptdXRhdGUoR2x1QV9HbHVfcmF0aW8gPSBHbHV0YW1pY19hY2lkL0dsdXRhbWluZSkgJT4lCiAgdGlkeXI6OnNlcGFyYXRlKHNhbXBsZWlkLCBzZXAgPSJfIiwgaW50byA9IGMoIk1ldGFib2xvbWljc19SdW4iLCBOQSwgTkEpLCByZW1vdmUgPSBGQUxTRSkgJT4lCiAgZHBseXI6OmxlZnRfam9pbihtZXRhZGF0YSwgYnkgPSJNb3VzZUlEIiklPiUKICBkcGx5cjo6c2VsZWN0KC1Db3J0aXNvbCkgIyBzaWduYWwgdG9vIHdlYWsKYGBgCmBgYHtyIGZpZy53aWR0aD03LCBmaWcuaGVpZ2h0PSA1fQpMQ01TX3NlcnVtLjIgJT4lCiAgdGlkeXI6OmdhdGhlcihtb2xlY3VsZSwgY29uY19hcmVhLCBDb3J0aWNvc3Rlcm9uZTpHQUJBKSAlPiUKICBkcGx5cjo6bXV0YXRlKFNleF9DYXRlZ29yeSA9IHBhc3RlKFNleCwgQ2F0ZWdvcnksIHNlcCA9ICJfIikpICU+JQogIGdncGxvdChhZXMoeD0JU2V4X0NhdGVnb3J5ICx5PSBjb25jX2FyZWEsIGZpbGw9ZmFjdG9yKENhdGVnb3J5KSkpICsKICBnZW9tX2JveHBsb3QoYWxwaGEgPTAuNywgb3V0bGllci5zaGFwZSA9IE5BKSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jb2xvcl9DYXRlZ29yeSwgbGFiZWwgPSBjKCJLaWxsZWQtQ00iLCAiTGl2ZS1DTSIpLCBuYW1lID0gIlRyZWF0bWVudCIpICsKICBsYWJzKGZpbGwgPSAiQ2F0ZWdvcnkiKSArIAogIGdlb21fcG9pbnQoYWxwaGEgPTAuNywgc2l6ZSA9MC41LCBwb3NpdGlvbj1wb3NpdGlvbl9qaXR0ZXJkb2RnZShqaXR0ZXIud2lkdGg9MC43KSwKICAgICAgICAgICAgIHNob3cubGVnZW5kID0gVCkgKwogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTEpICsgCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBmdW5jdGlvbih4KSBmb3JtYXQoeCwgc2NpZW50aWZpYyA9IFRSVUUpKSArCiAgZmFjZXRfd3JhcChtb2xlY3VsZX4uLCBzY2FsZXMgPSAiZnJlZSIsIG5jb2wgPSA0KSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiRlxuS2lsbGVkLVxuQ00iLCAiRlxuTGl2ZS1cbkNNIiwgIk1cbktpbGxlZC1cbkNNIiwgIk1cbkxpdmUtXG5DTSIpKSAKYGBgCmBgYHtyIGV2YWw9RkFMU0V9CkxDTVNfc2VydW1fRiA8LSBMQ01TX3NlcnVtLjIgJT4lCiAgZHBseXI6OmZpbHRlcihTZXggPT0gIkYiKQpMQ01TX3NlcnVtX00gPC0gTENNU19zZXJ1bS4yICU+JQogIGRwbHlyOjpmaWx0ZXIoU2V4ID09ICJNIikKCkxDTVNfc2VydW1fRl9tZXRhYm9saXRlcyA8LSBMQ01TX3NlcnVtX0YgJT4lCiAgZHBseXI6OnNlbGVjdChzYW1wbGVpZCwgQ29ydGljb3N0ZXJvbmU6R0FCQSkgJT4lCiAgdGliYmxlOjpjb2x1bW5fdG9fcm93bmFtZXModmFyID0ic2FtcGxlaWQiKQoKTENNU19zZXJ1bV9NX21ldGFib2xpdGVzIDwtIExDTVNfc2VydW1fTSAlPiUKICBkcGx5cjo6c2VsZWN0KHNhbXBsZWlkLCBDb3J0aWNvc3Rlcm9uZTpHQUJBKSAlPiUKICB0aWJibGU6OmNvbHVtbl90b19yb3duYW1lcyh2YXIgPSJzYW1wbGVpZCIpCgpMQ01TX3NlcnVtX0ZfbWV0YWRhdGEgPC0gTENNU19zZXJ1bV9GICU+JQogIGRwbHlyOjpzZWxlY3Qoc2FtcGxlaWQsIE1vdXNlSUQsIE1ldGFib2xvbWljc19SdW4sIEJhdGNoLCBDYXRlZ29yeSkgJT4lCiAgdGliYmxlOjpjb2x1bW5fdG9fcm93bmFtZXModmFyID0ic2FtcGxlaWQiKQoKTENNU19zZXJ1bV9NX21ldGFkYXRhIDwtIExDTVNfc2VydW1fTSAlPiUKICBkcGx5cjo6c2VsZWN0KHNhbXBsZWlkLCBNb3VzZUlELCBNZXRhYm9sb21pY3NfUnVuLCBCYXRjaCwgQ2F0ZWdvcnkpICU+JQogIHRpYmJsZTo6Y29sdW1uX3RvX3Jvd25hbWVzKHZhciA9InNhbXBsZWlkIikKCm9wdGlvbnMoYmFja3VwX29wdGlvbnMpCgpNYWFzbGluX0xDTVNfRiA9IE1hYXNsaW4yKAogICAgaW5wdXRfZGF0YSA9IExDTVNfc2VydW1fRl9tZXRhYm9saXRlcywgCiAgICBpbnB1dF9tZXRhZGF0YSA9IExDTVNfc2VydW1fRl9tZXRhZGF0YSwgCiAgICBvdXRwdXQgPSAiLi9kYXRhL0ludGVyaW1fb3V0cHV0L01hYXNsaW5fTENNU19GIiwgCiAgICBmaXhlZF9lZmZlY3RzID0gYygiQ2F0ZWdvcnkiLCAiTWV0YWJvbG9taWNzX1J1biIpLCAKICAgIHJhbmRvbV9lZmZlY3RzID0gYygiQmF0Y2giKSwgCiAgICBtaW5fcHJldmFsZW5jZSA9IDAuNywgCiAgICBtYXhfc2lnbmlmaWNhbmNlID0gMC4xNSkKTWFhc2xpbl9MQ01TX00gPSBNYWFzbGluMigKICAgIGlucHV0X2RhdGEgPSBMQ01TX3NlcnVtX01fbWV0YWJvbGl0ZXMsIAogICAgaW5wdXRfbWV0YWRhdGEgPSBMQ01TX3NlcnVtX01fbWV0YWRhdGEsIAogICAgb3V0cHV0ID0gIi4vZGF0YS9JbnRlcmltX291dHB1dC9NYWFzbGluX0xDTVNfTSIsIAogICAgZml4ZWRfZWZmZWN0cyA9IGMoIkNhdGVnb3J5IiwgIk1ldGFib2xvbWljc19SdW4iKSwgCiAgICByYW5kb21fZWZmZWN0cyA9IGMoIkJhdGNoIiksIAogICAgbWluX3ByZXZhbGVuY2UgPSAwLjcsIAogICAgbWF4X3NpZ25pZmljYW5jZSA9IDAuMTUpCmBgYApgYGB7cn0KTWFhc2xpbl9MQ01TX0ZfcmVzdWx0cyA8LSBmcmVhZCgiLi9kYXRhL0ludGVyaW1fb3V0cHV0L01hYXNsaW5fTENNU19GL2FsbF9yZXN1bHRzLnRzdiIpCk1hYXNsaW5fTENNU19NX3Jlc3VsdHMgPC0gZnJlYWQoIi4vZGF0YS9JbnRlcmltX291dHB1dC9NYWFzbGluX0xDTVNfTS9hbGxfcmVzdWx0cy50c3YiKQoKTWFhc2xpbl9MQ01TX0ZfcmVzdWx0cy4yIDwtIE1hYXNsaW5fTENNU19GX3Jlc3VsdHMgJT4lCiAgZHBseXI6OmZpbHRlcihtZXRhZGF0YSA9PSAiQ2F0ZWdvcnkiKSAlPiUKICBkcGx5cjo6bXV0YXRlKHF2YWwyID0gcC5hZGp1c3QocHZhbCwgbWV0aG9kID0gIkJIIikpICU+JQogIGRwbHlyOjphcnJhbmdlKHF2YWwyKSAKTWFhc2xpbl9MQ01TX0ZfcmVzdWx0cy4yCgpNYWFzbGluX0xDTVNfTV9yZXN1bHRzLjIgPC1NYWFzbGluX0xDTVNfTV9yZXN1bHRzICU+JQogIGRwbHlyOjpmaWx0ZXIobWV0YWRhdGEgPT0gIkNhdGVnb3J5IikgJT4lCiAgZHBseXI6Om11dGF0ZShxdmFsMiA9IHAuYWRqdXN0KHB2YWwsIG1ldGhvZCA9ICJCSCIpKSAlPiUKICBkcGx5cjo6YXJyYW5nZShxdmFsMikgCk1hYXNsaW5fTENNU19NX3Jlc3VsdHMuMgpgYGAKYGBge3J9CkZpZzRfQ29ydGljb3N0ZXJvbmUgPC0gTENNU19zZXJ1bS4yICU+JSAKICBkcGx5cjo6bXV0YXRlKENvcnRpY29zdGVyb25lXzEweDQgPSBDb3J0aWNvc3Rlcm9uZS8xMDAwMCkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gQ2F0ZWdvcnksIHkgPSBDb3J0aWNvc3Rlcm9uZV8xMHg0LCBzaGFwZSA9IFNleCwgY29sb3IgPSBDYXRlZ29yeSkpICsgCiAgZ2VvbV9xdWFzaXJhbmRvbShhbHBoYSA9IDAuNywgc2l6ZSA9IDAuNzUpICsKICBzdGF0X3N1bW1hcnkoZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNpemU9MiwgYWVzKGdyb3VwID0gQ2F0ZWdvcnkpLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC42LCBzaGFwZSA9IDE1KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX0NhdGVnb3J5LCBsYWJlbCA9IGMoIktpbGxlZC1DTSIsICJMaXZlLUNNIiksIG5hbWUgPSAiVHJlYXRtZW50IikgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBzaGFwZV9TZXgsIGxhYmVsID0gYygiRmVtYWxlIiwgIk1hbGUiKSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIktpbGxlZCIgPSAiS2lsbGVkLVxuQ00iLCAiTGl2ZSIgPSAiTGl2ZS1cbkNNIikpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDEwKSArCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICBsYWJzKHkgPSJDb3J0aWNvc3Rlcm9uZVxuKFBBKSB4IGU0IikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpICsKICBmYWNldF9ncmlkKC5+U2V4ICwgc2NhbGVzID0iZnJlZSIpICsKICB0aGVtZShzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLHN0cmlwLnRleHQgPSBlbGVtZW50X2JsYW5rKCkpIApGaWc0X0NvcnRpY29zdGVyb25lCgpGaWdTNV9MQ01TIDwtIExDTVNfc2VydW0uMiAlPiUgCiAgZHBseXI6Om11dGF0ZShTZXhfQ2F0ZWdvcnkgPXBhc3RlIChTZXgsIENhdGVnb3J5LCBzZXAgPSJfIikpICU+JQogIGRwbHlyOjpzZWxlY3QoQ2F0ZWdvcnksIFNleF9DYXRlZ29yeSwgQmF0Y2gsIFNleCwgR2x1dGFtaWNfYWNpZCwgR2x1dGFtaW5lLCBIaXN0YW1pbmUsIEluZG9sZWxhY3RpY19hY2lkLCBLeW51cmVuaW5lLCBUaHlyb3hpbmUsIFNlcm90b25pbiwgVHJ5cHRvcGhhbiwgS3ludXJlbmljX2FjaWQsIEdBQkEpICU+JQogIGRwbHlyOjpyZW5hbWUoR2x1ID0gR2x1dGFtaWNfYWNpZCwgR2xuID0gR2x1dGFtaW5lLCBJTEEgPSBJbmRvbGVsYWN0aWNfYWNpZCwgS1lOID0gS3ludXJlbmluZSwgVDQgPSBUaHlyb3hpbmUsIEtZTkEgPSBLeW51cmVuaWNfYWNpZCkgJT4lIAogIHRpZHlyOjpnYXRoZXIobWV0YWJvbGl0ZSwgbWVhc3VyZW1lbnQsIGMoR2x1OkdBQkEpKSAlPiUKICBkcGx5cjo6bXV0YXRlKG1lYXN1cmVtZW50ID0gYXMubnVtZXJpYyhtZWFzdXJlbWVudCkpICU+JQogIGRwbHlyOjptdXRhdGUobWVhc3VyZW1lbnRfMTB4NCA9IG1lYXN1cmVtZW50LzEwMDAwKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBDYXRlZ29yeSwgeSA9IG1lYXN1cmVtZW50XzEweDQsIHNoYXBlID0gU2V4LCBjb2xvciA9IENhdGVnb3J5KSkgKyAKICBnZW9tX3F1YXNpcmFuZG9tKGFscGhhID0gMC43LCBzaXplID0gMC43NSkgKwogIHN0YXRfc3VtbWFyeShmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2l6ZT0yLCBhZXMoZ3JvdXAgPSBDYXRlZ29yeSksIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjYsIHNoYXBlID0gMTUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JfQ2F0ZWdvcnksIGxhYmVsID0gYygiS2lsbGVkLUNNIiwgIkxpdmUtQ00iKSwgbmFtZSA9ICJUcmVhdG1lbnQiKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IHNoYXBlX1NleCwgbGFiZWwgPSBjKCJGZW1hbGUiLCAiTWFsZSIpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiS2lsbGVkIiA9ICJLIiwgIkxpdmUiID0gIkwiKSkgKwogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTApICsKICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIGxhYnMoeSA9IGV4cHJlc3Npb24ocGFzdGUoIihQQS9tbCkgeCAiLCBlXjQpKSkgKwogIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCkpICsKICBnZ2g0eDo6ZmFjZXRfbmVzdGVkX3dyYXAofiBtZXRhYm9saXRlICsgU2V4LCBzY2FsZXMgPSJmcmVlX3kiLCBuY29sID0xMCwgbGFiZWxsZXI9ZnVuY3Rpb24oeCkge3hbMV19KSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSkgKwogIHRoZW1lKHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCkpCkZpZ1M1X0xDTVMKYGBgCgoKIyMjIHVudGFyZ2V0ZWQgc2VydW0gbWV0YWJvbGl0ZXMgKExDX01TKQpgYGB7ciBldmFsPUZBTFNFfQpNYWFzbGluX2VlIDwtIFByb21ldGhpb25fYWN0aXZpdHlfZWUuMl9NRiAlPiUKICBkcGx5cjo6c2VsZWN0KE1vdXNlSUQsIEVFX2F2ZXJhZ2VfcGVyX2hvdXJfcmVzaWR1YWwpIAoKTWFhc2xpbl9tZXRhZGF0YSA8LSBMQ01TX3NlcnVtLjIgJT4lIGRwbHlyOjpzZWxlY3Qoc2FtcGxlaWQsIE1vdXNlSUQsIENhdGVnb3J5LCBTZXgsIEJhdGNoLCBNZXRhYm9sb21pY3NfUnVuKQoKeGNtc19wZWFrbGlzdCA8LSBMQ01TX3hjbXNfb3V0cHV0ICU+JQogIGRwbHlyOjpzZWxlY3QobXptZWQsIHJ0bWVkLCBSM19TMTFfNjQ1NjpSM19TOV82NDM4LCBSMV9TMTNfNTkxNjpSMV9TOV82MTg5KSAlPiUgCiAgZHBseXI6Om11dGF0ZShTYW1wbGUgPSBwYXN0ZShtem1lZCwgcnRtZWQsIHNlcCA9Ii8iKSkgJT4lCiAgZHBseXI6OnNlbGVjdChTYW1wbGUsIFIzX1MxMV82NDU2OlIxX1M5XzYxODksIC1SM19TMzdfNjQyMCkgCgoKeGNtc19tZXRhZGF0YSA8LSB4Y21zX3BlYWtsaXN0ICU+JSAKICB0aWR5cjo6Z2F0aGVyKHZhciwgdmFsdWUsIC1TYW1wbGUpICU+JSAKICB0aWR5cjo6c3ByZWFkKFNhbXBsZSwgdmFsdWUpICU+JQogIGRwbHlyOjpyZW5hbWUoc2FtcGxlaWQgPSB2YXIpICU+JQogIGRwbHlyOjpzZWxlY3Qoc2FtcGxlaWQpICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4oTWFhc2xpbl9tZXRhZGF0YSwgYnkgPSJzYW1wbGVpZCIpICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4oTWFhc2xpbl9lZSwgYnkgPSJNb3VzZUlEIikgJT4lCiAgZHBseXI6OnNlbGVjdChzYW1wbGVpZCwgQ2F0ZWdvcnksIFNleCwgQmF0Y2gsIEVFX2F2ZXJhZ2VfcGVyX2hvdXJfcmVzaWR1YWwsIE1ldGFib2xvbWljc19SdW4pIAoKeGNtc19tZXRhZGF0YV9GIDwtIHhjbXNfbWV0YWRhdGEgJT4lIAogIGRwbHlyOjpmaWx0ZXIoU2V4ID09ICJGIikKeGNtc19tZXRhZGF0YV9NIDwtIHhjbXNfbWV0YWRhdGEgJT4lIAogIGRwbHlyOjpmaWx0ZXIoU2V4ID09ICJNIikKCmZlbWFsZXMgPC0geGNtc19tZXRhZGF0YV9GICU+JSBwdWxsKHNhbXBsZWlkKQptYWxlcyA8LSB4Y21zX21ldGFkYXRhX00gJT4lIHB1bGwoc2FtcGxlaWQpCgp4Y21zX3BlYWtsaXN0X0YgPC0geGNtc19wZWFrbGlzdCAlPiUgCiAgZHBseXI6OnNlbGVjdChTYW1wbGUsIGNvbnRhaW5zKGZlbWFsZXMpKSAlPiUKICBkcGx5cjo6cmVuYW1lKHNhbXBsZWlkID0gU2FtcGxlKQp4Y21zX3BlYWtsaXN0X00gPC14Y21zX3BlYWtsaXN0ICU+JSAKICBkcGx5cjo6c2VsZWN0KFNhbXBsZSwgY29udGFpbnMobWFsZXMpKSU+JQogIGRwbHlyOjpyZW5hbWUoc2FtcGxlaWQgPSBTYW1wbGUpCgp4Y21zX3BlYWtsaXN0X0YyIDwtIHhjbXNfcGVha2xpc3RfRiAlPiUKICBkcGx5cjo6bXV0YXRlKHNhbXBsZWlkID0gc3ViKCcvJywgJ19ydCcsIHNhbXBsZWlkKSkgJT4lCiAgZHBseXI6Om11dGF0ZShzYW1wbGVpZCA9IHBhc3RlKCJteiIsIHNhbXBsZWlkLCBzZXAgPSAiIikpICU+JQogIGRwbHlyOjpyb3d3aXNlKCkgJT4lCiAgZHBseXI6Om11dGF0ZShyb3dfbWVhbiA9IG1lYW4oUjFfUzEwXzYzMDM6UjNfUzlfNjQzOCkpICU+JSAjIGNyZWF0ZSBhIHJvdyB3aXRoIG1lYW4gaW50ZW5zaXR5IG9mIHBlYWsKICBkcGx5cjo6dW5ncm91cCgpICU+JSAKICBkcGx5cjo6c2xpY2VfbWF4KHJvd19tZWFuLCBuID0gNTAwMCkgJT4lICMgc2VsZWN0IHRvcCA1MDAwIHBlYWtzIGFjY29yZGluZyB0byBtZWFuIGludGVuc2l0eQogIGRwbHlyOjpzZWxlY3QoLXJvd19tZWFuKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gInNhbXBsZWlkIikgJT4lCiAgZHBseXI6OnNlbGVjdChzb3J0KG5hbWVzKC4pKSkKeGNtc19tZXRhZGF0YV9GMiA8LSB4Y21zX21ldGFkYXRhX0YgJT4lCiAgZHBseXI6OmFycmFuZ2Uoc2FtcGxlaWQpICU+JQogIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAic2FtcGxlaWQiKQoKeGNtc19wZWFrbGlzdF9NMiA8LSB4Y21zX3BlYWtsaXN0X00gJT4lCiAgZHBseXI6Om11dGF0ZShzYW1wbGVpZCA9IHN1YignLycsICdfcnQnLCBzYW1wbGVpZCkpICU+JQogIGRwbHlyOjptdXRhdGUoc2FtcGxlaWQgPSBwYXN0ZSgibXoiLCBzYW1wbGVpZCwgc2VwID0gIiIpKSAlPiUKICBkcGx5cjo6cm93d2lzZSgpICU+JQogIGRwbHlyOjptdXRhdGUocm93X21lYW4gPSBtZWFuKFIxX1MxXzYzNDI6UjNfUzhfNjM4MikpICU+JSAjIGNyZWF0ZSBhIHJvdyB3aXRoIG1lYW4gaW50ZW5zaXR5IG9mIHBlYWsKICBkcGx5cjo6dW5ncm91cCgpICU+JSAKICBkcGx5cjo6c2xpY2VfbWF4KHJvd19tZWFuLCBuID0gNTAwMCkgJT4lICMgc2VsZWN0IHRvcCA1MDAwIHBlYWtzIGFjY29yZGluZyB0byBtZWFuIGludGVuc2l0eQogIGRwbHlyOjpzZWxlY3QoLXJvd19tZWFuKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gInNhbXBsZWlkIikgJT4lCiAgZHBseXI6OnNlbGVjdChzb3J0KG5hbWVzKC4pKSkKeGNtc19tZXRhZGF0YV9NMiA8LSB4Y21zX21ldGFkYXRhX00gJT4lCiAgZHBseXI6OmFycmFuZ2Uoc2FtcGxlaWQpICU+JQogIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAic2FtcGxlaWQiKQoKb3B0aW9ucyhiYWNrdXBfb3B0aW9ucykKClhjbXNfTWFhc2xpbl9GID0gTWFhc2xpbjIoCiAgICBpbnB1dF9kYXRhID0geGNtc19wZWFrbGlzdF9GMiwgCiAgICBpbnB1dF9tZXRhZGF0YSA9IHhjbXNfbWV0YWRhdGFfRjIsIAogICAgb3V0cHV0ID0gIi4vZGF0YS9JbnRlcmltX291dHB1dC9YY21zX01hYXNsaW5fRiIsIAogICAgZml4ZWRfZWZmZWN0cyA9IGMoIkNhdGVnb3J5IiwgIk1ldGFib2xvbWljc19SdW4iKSwgCiAgICByYW5kb21fZWZmZWN0cyA9IGMoIkJhdGNoIiksIAogICAgbWluX3ByZXZhbGVuY2UgPSAwLjcsIAogICAgbWF4X3NpZ25pZmljYW5jZSA9IDAuMSwgCiAgICBwbG90X2hlYXRtYXAgPSBGQUxTRSwgCiAgICBwbG90X3NjYXR0ZXIgPSBGQUxTRSkKClhjbXNfTWFhc2xpbl9NID0gTWFhc2xpbjIoCiAgICBpbnB1dF9kYXRhID0geGNtc19wZWFrbGlzdF9NMiwgCiAgICBpbnB1dF9tZXRhZGF0YSA9IHhjbXNfbWV0YWRhdGFfTTIsIAogICAgb3V0cHV0ID0gIi4vZGF0YS9JbnRlcmltX291dHB1dC9YY21zX01hYXNsaW5fTSIsIAogICAgZml4ZWRfZWZmZWN0cyA9IGMoIkNhdGVnb3J5IiwgIk1ldGFib2xvbWljc19SdW4iKSwgCiAgICByYW5kb21fZWZmZWN0cyA9IGMoIkJhdGNoIiksIAogICAgbWluX3ByZXZhbGVuY2UgPSAwLjcsIAogICAgbWF4X3NpZ25pZmljYW5jZSA9IDAuMSwgCiAgICBwbG90X2hlYXRtYXAgPSBGQUxTRSwgCiAgICBwbG90X3NjYXR0ZXIgPSBGQUxTRSkKClhjbXNfTWFhc2xpbl9GX0VFID0gTWFhc2xpbjIoCiAgICBpbnB1dF9kYXRhID0geGNtc19wZWFrbGlzdF9GMiwgCiAgICBpbnB1dF9tZXRhZGF0YSA9IHhjbXNfbWV0YWRhdGFfRjIsIAogICAgb3V0cHV0ID0gIi4vZGF0YS9JbnRlcmltX291dHB1dC9YY21zX01hYXNsaW5fRl9FRSIsIAogICAgZml4ZWRfZWZmZWN0cyA9IGMoIkVFX2F2ZXJhZ2VfcGVyX2hvdXJfcmVzaWR1YWwiLCAiTWV0YWJvbG9taWNzX1J1biIpLCAKICAgIHJhbmRvbV9lZmZlY3RzID0gYygiQmF0Y2giKSwgCiAgICBtaW5fcHJldmFsZW5jZSA9IDAuNywgCiAgICBtYXhfc2lnbmlmaWNhbmNlID0gMC4xLCAKICAgIHBsb3RfaGVhdG1hcCA9IEZBTFNFLCAKICAgIHBsb3Rfc2NhdHRlciA9IEZBTFNFKQoKWGNtc19NYWFzbGluX01fRUUgPSBNYWFzbGluMigKICAgIGlucHV0X2RhdGEgPSB4Y21zX3BlYWtsaXN0X00yLCAKICAgIGlucHV0X21ldGFkYXRhID0geGNtc19tZXRhZGF0YV9NMiwgCiAgICBvdXRwdXQgPSAiLi9kYXRhL0ludGVyaW1fb3V0cHV0L1hjbXNfTWFhc2xpbl9NX0VFIiwgCiAgICBmaXhlZF9lZmZlY3RzID0gYygiRUVfYXZlcmFnZV9wZXJfaG91cl9yZXNpZHVhbCIsICJNZXRhYm9sb21pY3NfUnVuIiksIAogICAgcmFuZG9tX2VmZmVjdHMgPSBjKCJCYXRjaCIpLCAKICAgIG1pbl9wcmV2YWxlbmNlID0gMC43LCAKICAgIG1heF9zaWduaWZpY2FuY2UgPSAwLjEsIAogICAgcGxvdF9oZWF0bWFwID0gRkFMU0UsIAogICAgcGxvdF9zY2F0dGVyID0gRkFMU0UpCmBgYApgYGB7ciBldmFsPUZBTFNFfQpYY21zX01hYXNsaW5fRl9yZXN1bHRzPC0gZnJlYWQoIi4vZGF0YS9JbnRlcmltX291dHB1dC9YY21zX01hYXNsaW5fRi9hbGxfcmVzdWx0cy50c3YiKQpYY21zX01hYXNsaW5fTV9yZXN1bHRzPC0gZnJlYWQoIi4vZGF0YS9JbnRlcmltX291dHB1dC9YY21zX01hYXNsaW5fTS9hbGxfcmVzdWx0cy50c3YiKQoKWGNtc19NYWFzbGluX0ZfRUVfcmVzdWx0czwtIGZyZWFkKCIuL2RhdGEvSW50ZXJpbV9vdXRwdXQvWGNtc19NYWFzbGluX0ZfRUUvYWxsX3Jlc3VsdHMudHN2IikKWGNtc19NYWFzbGluX01fRUVfcmVzdWx0czwtIGZyZWFkKCIuL2RhdGEvSW50ZXJpbV9vdXRwdXQvWGNtc19NYWFzbGluX01fRUUvYWxsX3Jlc3VsdHMudHN2IikKYGBgCmBgYHtyIGV2YWw9RkFMU0V9CiNUcmVhdG1lbnQKWGNtc19NYWFzbGluX0Zfc3RhdHMgPC1YY21zX01hYXNsaW5fRl9yZXN1bHRzICU+JSAKICBhcy5kYXRhLmZyYW1lKCkgJT4lCiAgZHBseXI6OmZpbHRlcihtZXRhZGF0YSA9PSAiQ2F0ZWdvcnkiKSAlPiUKICBkcGx5cjo6bXV0YXRlKHQuc2NvcmUgPSBjb2VmL3N0ZGVycikgJT4lIAogIHRpZHlyOjpzZXBhcmF0ZShmZWF0dXJlLCBzZXAgPSAiX3J0IiwgaW50byA9IGMoIm0ueiIsICJyLnQiKSkgJT4lCiAgZHBseXI6Om11dGF0ZShtLnogPSBzdWIoIm16IiwgIiIsIG0ueikpICU+JQogIGRwbHlyOjptdXRhdGUocXZhbDIgPSBwLmFkanVzdChwdmFsLCBtZXRob2QgPSAiQkgiKSkgJT4lCiAgZHBseXI6OnJlbmFtZShwLnZhbHVlID0gcXZhbDIpICU+JQogIGRwbHlyOjphcnJhbmdlKHAudmFsdWUpICU+JQogIGRwbHlyOjpzZWxlY3QobS56LCByLnQsIHAudmFsdWUsIHQuc2NvcmUpCgpYY21zX01hYXNsaW5fTV9zdGF0cyA8LVhjbXNfTWFhc2xpbl9NX3Jlc3VsdHMgJT4lIAogIGFzLmRhdGEuZnJhbWUoKSAlPiUKICBkcGx5cjo6ZmlsdGVyKG1ldGFkYXRhID09ICJDYXRlZ29yeSIpICU+JQogIGRwbHlyOjptdXRhdGUodC5zY29yZSA9IGNvZWYvc3RkZXJyKSAlPiUgCiAgdGlkeXI6OnNlcGFyYXRlKGZlYXR1cmUsIHNlcCA9ICJfcnQiLCBpbnRvID0gYygibS56IiwgInIudCIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKG0ueiA9IHN1YigibXoiLCAiIiwgbS56KSkgJT4lCiAgZHBseXI6Om11dGF0ZShxdmFsMiA9IHAuYWRqdXN0KHB2YWwsIG1ldGhvZCA9ICJCSCIpKSAlPiUKICBkcGx5cjo6cmVuYW1lKHAudmFsdWUgPSBxdmFsMikgJT4lCiAgZHBseXI6OmFycmFuZ2UocC52YWx1ZSkgJT4lCiAgZHBseXI6OnNlbGVjdChtLnosIHIudCwgcC52YWx1ZSwgdC5zY29yZSkKCiNFRQpYY21zX01hYXNsaW5fRl9FRV9zdGF0cyA8LVhjbXNfTWFhc2xpbl9GX0VFX3Jlc3VsdHMgJT4lIAogIGFzLmRhdGEuZnJhbWUoKSAlPiUKICBkcGx5cjo6ZmlsdGVyKG1ldGFkYXRhID09ICJFRV9hdmVyYWdlX3Blcl9ob3VyX3Jlc2lkdWFsIikgJT4lCiAgZHBseXI6Om11dGF0ZSh0LnNjb3JlID0gY29lZi9zdGRlcnIpICU+JSAKICB0aWR5cjo6c2VwYXJhdGUoZmVhdHVyZSwgc2VwID0gIl9ydCIsIGludG8gPSBjKCJtLnoiLCAici50IikpICU+JQogIGRwbHlyOjptdXRhdGUobS56ID0gc3ViKCJteiIsICIiLCBtLnopKSAlPiUKICBkcGx5cjo6bXV0YXRlKHF2YWwyID0gcC5hZGp1c3QocHZhbCwgbWV0aG9kID0gIkJIIikpICU+JQogIGRwbHlyOjpyZW5hbWUocC52YWx1ZSA9IHF2YWwyKSAlPiUKICBkcGx5cjo6YXJyYW5nZShwLnZhbHVlKSAlPiUKICBkcGx5cjo6c2VsZWN0KG0ueiwgci50LCBwLnZhbHVlLCB0LnNjb3JlKQoKWGNtc19NYWFzbGluX01fRUVfc3RhdHMgPC1YY21zX01hYXNsaW5fTV9FRV9yZXN1bHRzICU+JSAKICBhcy5kYXRhLmZyYW1lKCkgJT4lCiAgZHBseXI6OmZpbHRlcihtZXRhZGF0YSA9PSAiRUVfYXZlcmFnZV9wZXJfaG91cl9yZXNpZHVhbCIpICU+JQogIGRwbHlyOjptdXRhdGUodC5zY29yZSA9IGNvZWYvc3RkZXJyKSAlPiUgCiAgdGlkeXI6OnNlcGFyYXRlKGZlYXR1cmUsIHNlcCA9ICJfcnQiLCBpbnRvID0gYygibS56IiwgInIudCIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKG0ueiA9IHN1YigibXoiLCAiIiwgbS56KSkgJT4lCiAgZHBseXI6Om11dGF0ZShxdmFsMiA9IHAuYWRqdXN0KHB2YWwsIG1ldGhvZCA9ICJCSCIpKSAlPiUKICBkcGx5cjo6cmVuYW1lKHAudmFsdWUgPSBxdmFsMikgJT4lCiAgZHBseXI6OmFycmFuZ2UocC52YWx1ZSkgJT4lCiAgZHBseXI6OnNlbGVjdChtLnosIHIudCwgcC52YWx1ZSwgdC5zY29yZSkKYGBgCmBgYHtyIGV2YWw9RkFMU0V9CndyaXRlLnRhYmxlKFhjbXNfTWFhc2xpbl9GX3N0YXRzLCBmaWxlID0gIi4vZGF0YS9JbnRlcmltX291dHB1dC9YY21zX01hYXNsaW5fRl9zdGF0cy50eHQiLCBzZXAgPSAiLCIgLHJvdy5uYW1lcyA9IEZBTFNFLCBxdW90ZSA9IEZBTFNFKQp3cml0ZS50YWJsZShYY21zX01hYXNsaW5fTV9zdGF0cywgZmlsZSA9ICIuL2RhdGEvSW50ZXJpbV9vdXRwdXQvWGNtc19NYWFzbGluX01fc3RhdHMudHh0Iiwgc2VwID0gIiwiICxyb3cubmFtZXMgPSBGQUxTRSwgcXVvdGUgPSBGQUxTRSkKCndyaXRlLnRhYmxlKFhjbXNfTWFhc2xpbl9GX0VFX3N0YXRzLCBmaWxlID0gIi4vZGF0YS9JbnRlcmltX291dHB1dC9YY21zX01hYXNsaW5fRl9FRV9zdGF0cy50eHQiLCBzZXAgPSAiLCIgLHJvdy5uYW1lcyA9IEZBTFNFLCBxdW90ZSA9IEZBTFNFKQp3cml0ZS50YWJsZShYY21zX01hYXNsaW5fTV9FRV9zdGF0cywgZmlsZSA9ICIuL2RhdGEvSW50ZXJpbV9vdXRwdXQvWGNtc19NYWFzbGluX01fRUVfc3RhdHMudHh0Iiwgc2VwID0gIiwiICxyb3cubmFtZXMgPSBGQUxTRSwgcXVvdGUgPSBGQUxTRSkKYGBgCk1ldGFib0FuYWx5c3QgT3V0cHV0CmBgYHtyfQpNQV9pbnRfRl9FRSA8LSBmcmVhZCgiLi9kYXRhL01ldGFib2xvbWljcy9tZXRhYm9hbmFseXN0L01ldGFib0FuYWx5c3RfRl9FRS9tdW1taWNob2dfaW50ZWdfcGF0aHdheV9lbnJpY2htZW50LmNzdiIpCk1BX2dzZWFfRl9FRSA8LSBmcmVhZCgiLi9kYXRhL01ldGFib2xvbWljcy9tZXRhYm9hbmFseXN0L01ldGFib0FuYWx5c3RfRl9FRS9tdW1taWNob2dfZmdzZWFfcGF0aHdheV9lbnJpY2htZW50LmNzdiIpCgojRmVtYWxlcwpNQV9nc2VhX0ZfQ00uMiA8LSBNQV9nc2VhX0ZfRUUgJT4lCiAgZHBseXI6OnJlbmFtZShQYXRod2F5ID0gVjEpJT4lCiAgZHBseXI6OnNlbGVjdChQYXRod2F5LCBORVMpIAoKTUFfaW50X0ZfRUUuMiA8LSBNQV9pbnRfRl9FRSAlPiUgCiAgZHBseXI6OnJlbmFtZShQYXRod2F5ID0gVjEpJT4lCiAgZHBseXI6OnNlbGVjdChQYXRod2F5LCBDb21iaW5lZF9QdmFscykgJT4lCiAgZHBseXI6OmZpbHRlcihDb21iaW5lZF9QdmFscyA8PSAwLjA1KSAlPiUKICBkcGx5cjo6bGVmdF9qb2luKE1BX2dzZWFfRl9DTS4yLCBieSA9ICJQYXRod2F5IikgJT4lCiAgZHBseXI6OmFycmFuZ2UoLU5FUykgJT4lCiAgZHBseXI6Om11dGF0ZShhbmFseXNpcyA9ICJGIiklPiUKICBkcGx5cjo6bXV0YXRlKHZhcmlhYmxlID0gIkVFIikKCkZpZzRfRl9FRV9wYXRod2F5IDwtIE1BX2ludF9GX0VFLjIgJT4lIAogIGRwbHlyOjphcnJhbmdlKE5FUykgJT4lIAogIGRwbHlyOjptdXRhdGUoUGF0aHdheSA9IGZhY3RvcihQYXRod2F5LCBsZXZlbHMgPSBQYXRod2F5KSkgJT4lIAogIGdncGxvdChhZXMoeSA9IE5FUywgeCA9IFBhdGh3YXksIGZpbGwgPSBDb21iaW5lZF9QdmFscykpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTApICsKICBzY2FsZV9maWxsX2dyYWRpZW50KGhpZ2ggPSAiI2ZlZDc5OSIsIGxvdyA9ICIjYjczNzc5IiwgbmEudmFsdWUgPSBOQSwgbmFtZSA9ICJDb21iaW5lZFxucC12YWx1ZSIpICsgCiAgY29vcmRfZmxpcCgpICsKICBnZ3RpdGxlKCJGIC0gRUUiKSsgCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpKwogIHRoZW1lKGF4aXMudGl0bGUueT1lbGVtZW50X2JsYW5rKCkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAncmlnaHQnKSArCiAgIHRoZW1lKAogICAgICAgIGxlZ2VuZC5rZXkuaGVpZ2h0ID0gdW5pdCgwLjUsICdjbScpLCAKICAgICAgICBsZWdlbmQua2V5LndpZHRoID0gdW5pdCgwLjUsICdjbScpKSAKRmlnNF9GX0VFX3BhdGh3YXkgCmBgYAojIyMgRmlnLiA0IC0gQ2hhbmdlcyBvZiBtZXRhYm9saXNtIGluIHJlbGF0aW9uIHRvIGFjdGl2aXR5IGFuZCBlbmVyZ3kgZXhwZW5kaXR1cmUuIApgYGB7cn0KRmlnNF9hbGlnbiA8LSBjb3dwbG90OjphbGlnbl9wbG90cyhGaWc0X3RvdGFsU0NGQSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZzRfdHNjZmFfZGlzdGFuY2UgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWc0X2J1dHlyYXRlKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWc0X2J1dHlyYXRlX2Rpc3RhbmNlICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlnNF9Db3J0aWNvc3Rlcm9uZSsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSAndicsIGF4aXMgPSAnbCcpCgoKRmlnNF8xIDwtIGNvd3Bsb3Q6OnBsb3RfZ3JpZChGaWc0X2FsaWduW1sxXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWc0X2FsaWduW1szXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWc0X2FsaWduW1syXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlnNF9hbGlnbltbNF1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbD00LCBucm93PTEsIGxhYmVscyA9IGMoIkEiLCAiQiIsICJDIiwgIkQiKSxsYWJlbF9zaXplID0gMTIsIHJlbF93aWR0aHMgPSBjKDIsIDIsMS44LCAxLjgpKQoKRmlnNF8yIDwtIGNvd3Bsb3Q6OnBsb3RfZ3JpZChGaWc0X2FsaWduW1s1XV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWc0X0ZfRUVfcGF0aHdheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWdlbmRfdHJlYXRtZW50X3NleCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sPTMsIG5yb3c9MSwgbGFiZWxzID0gYyggIkUiLCAiRiIsIE5BKSxsYWJlbF9zaXplID0gMTIsIHJlbF93aWR0aHMgPSBjKDIsIDQuMiwgMS40KSkKCgpGaWd1cmU0IDwtIGNvd3Bsb3Q6OnBsb3RfZ3JpZChOQSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZzRfMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlnNF8yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2w9MSwgbnJvdyA9IDMsIHJlbF9oZWlnaHRzID0gYygwLjEsIDEsMSkpCmBgYApgYGB7ciBmaWcud2lkdGg9Ni41LCBmaWcuaGVpZ2h0PSA0fQpGaWd1cmU0CmBgYApgYGB7ciBldmFsID0gRkFMU0V9Cmdnc2F2ZSgiLi9GaWd1cmU0LnBkZiIsIHBsb3QgPSBGaWd1cmU0LCBkZXZpY2UgPSBjYWlyb19wZGYsICAKICB3aWR0aCA9IDE3LAogIGhlaWdodCA9IDEwLjUsCiAgdW5pdHMgPSAiY20iKQpgYGAKIyMjIEZpZy4gUzUgLSBDYW5kaWRhdGUgbWV0YWJvbGl0ZXMgYXNzZXNzZWQgaW4gY2VjYWwgY29udGVudHMgYW5kIHNlcnVtIHNhbXBsZXMuCmBgYHtyfQpGaWdTNV9hbGlnbiA8LSBjb3dwbG90OjphbGlnbl9wbG90cyhGaWdTNV9TQ0ZBcyArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZ1M1X3RzY2ZhX2JlYW1icmVha3MgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWdTNV9idXR5cmF0ZV9iZWFtYnJlYWtzKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWdTNV9MQ01TICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSAndicsIGF4aXMgPSAnbCcpCgpGaWdTNV8xIDwtIGNvd3Bsb3Q6OnBsb3RfZ3JpZChGaWdTNV9hbGlnbltbMl1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWdTNV9hbGlnbltbM11dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMiwgbnJvdz0xLCBsYWJlbHMgPSBjKCJCIiwgIkMiKSwgbGFiZWxfc2l6ZSA9IDEyLCByZWxfd2lkdGhzID0gYygxLDEpKQoKRmlnUzVfMiA8LSBjb3dwbG90OjpwbG90X2dyaWQoRmlnUzVfMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWczX2xlZ2VuZF90cmVhdG1lbnRfc2V4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCBucm93PTIsIHJlbF9oZWlnaHRzID0gYygxLDAuNSkpCgpGaWdTNV8zPC0gY293cGxvdDo6cGxvdF9ncmlkKEZpZ1M1X2FsaWduW1sxXV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZ1M1XzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIsIG5yb3c9MSwgbGFiZWxzID0gYygiQSIsIE5BKSwgbGFiZWxfc2l6ZSA9IDEyLCByZWxfd2lkdGhzID0gYygxLCAxKSkKCkZpZ3VyZVM1IDwtIGNvd3Bsb3Q6OnBsb3RfZ3JpZChOQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZ1M1XzMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWdTNV9hbGlnbltbNF1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCBucm93PTUsIGxhYmVscyA9IGMoTkEsICJBIiwgTkEsICJEIiksbGFiZWxfc2l6ZSA9IDEyLCByZWxfaGVpZ2h0cyA9IGMoMC4xLDEsIDAuMSwgMSkpCmBgYApgYGB7ciBmaWcud2lkdGg9Ni41LCBmaWcuaGVpZ2h0PSA3fQpGaWd1cmVTNQpgYGAKYGBge3IgZXZhbCA9IEZBTFNFfQpnZ3NhdmUoIi4vRmlndXJlUzUucGRmIiwgcGxvdCA9IEZpZ19zdXBwLm1ldCwgZGV2aWNlID0gY2Fpcm9fcGRmLCAgCiAgd2lkdGggPSAxNy4zLAogIGhlaWdodCA9IDE4LAogIHVuaXRzID0gImNtIikKYGBgCiMjIFJlZ3JvdXBpbmcgbWljZSBieSBmaW5hbCBDLiBtaW51dGEgY29udGVudCBjb3Jyb2JvcmF0ZXMgdHJlYXRtZW50IGVmZmVjdHMKIyMjIEZpZ3VyZSBTNgpgYGB7cn0KbWVkaWFuX0NtaW5fcGVyX2dDQyA8LSBtZWRpYW4obWV0YWRhdGFfQ21pbiRxUENSX0NtaW5fU1FfcGVyX2dDQykgCgptZXRhZGF0YV9DbWluX0hMIDwtIG1ldGFkYXRhX0NtaW4gJT4lIAogIGRwbHlyOjptdXRhdGUoQ21pbl9sb2FkID0gaWZlbHNlKHFQQ1JfQ21pbl9TUV9wZXJfZ0NDID4gbWVkaWFuX0NtaW5fcGVyX2dDQywgIkhpZ2giLCAiTG93IikpICU+JQogIGRwbHlyOjptdXRhdGUoQ21pbl9sb2FkID0gZmFjdG9yKENtaW5fbG9hZCwgbGV2ZWxzID0gYygiTG93IiwgIkhpZ2giKSkpIAoKRmlnUzZfaGlnaF9Mb3cgPC0gbWV0YWRhdGFfQ21pbl9ITCAlPiUKICBkcGx5cjo6bXV0YXRlKENtaW5fcGVyX2dDQ18xZTcgPSBxUENSX0NtaW5fU1FfcGVyX2dDQyAvIDFlNykgJT4lIAogIGdncGxvdChhZXMoeCA9IENhdGVnb3J5LCB5ID0gQ21pbl9wZXJfZ0NDXzFlNywgc2hhcGUgPSBTZXgsIGNvbG9yID0gQ21pbl9sb2FkKSkgKyAKICBnZW9tX3F1YXNpcmFuZG9tKGFscGhhID0gMC43LCBzaXplID0gMC43NSkgKwogIHN0YXRfc3VtbWFyeShmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2l6ZT0yLCBhZXMoZ3JvdXAgPSBDYXRlZ29yeSksIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjYsIHNoYXBlID0gMTUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWNvbG9yX0hMLCBsYWJlbCA9IGMoIkxvdy1DTSIsICJIaWdoLUNNIiksbmFtZSA9ICJHcm91cCIpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gc2hhcGVfU2V4LCBsYWJlbCA9IGMoIkZlbWFsZSIsICJNYWxlIikpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDEwKSArCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICBsYWJzKHkgPSBleHByZXNzaW9uKHBhc3RlKCJDLiBtaW51dGEgKEdFL2cpIHggIiwgZV43KSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PShtZWRpYW5fQ21pbl9wZXJfZ0NDLyAxZTcpLCBsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiS2lsbGVkIiA9ICJLaWxsZWRcbkNNIiwgIkxpdmUiID0gIkxpdmVcbkNNIikpIApGaWdTNl9oaWdoX0xvdwpgYGAKYGBge3J9CnNldC5zZWVkKDc2MykKUHJvbWV0aGlvbl9Gb29kX0hMIDwtIG1ldGFkYXRhX0NtaW5fSEwgJT4lCiAgZHBseXI6OnNlbGVjdChNb3VzZUlELCBDbWluX2xvYWQpICAlPiUKICBkcGx5cjo6bGVmdF9qb2luKFByb21ldGhpb25fRm9vZCkgJT4lIAogIHRpZHlyOjpkcm9wX25hKENtaW5fbG9hZCwgUHJvbWV0aGlvbl93ZWlnaHRfbm9ybSkKClByb21ldGhpb25fRm9vZF9ITCRGSV9rY2FsX2RheV9ub3JtIDwtIHByZWRpY3QoYmVzdE5vcm1hbGl6ZShQcm9tZXRoaW9uX0Zvb2RfSEwkRklfa2NhbF9kYXkpKQoKb3B0aW9ucyhjb250cmFzdHM9YygiY29udHIuc3VtIiwgImNvbnRyLnBvbHkiKSkKbW9kZWxfZm9vZF9ITCA8LSBsbWVyVGVzdDo6bG1lcihGSV9rY2FsX2RheV9ub3JtIH4gQ21pbl9sb2FkKlNleCArIFNleCpQcm9tZXRoaW9uX3dlaWdodF9ub3JtICtQcm9tZXRoaW9uX0NhYmluZXQgKyAoQ21pbl9sb2FkfEJhdGNoL1NleC9Qcm9tZXRoaW9uX0NhYmluZXQpLCBkYXRhID0gUHJvbWV0aGlvbl9Gb29kX0hMKQpsbWVyVGVzdDo6c3RlcChtb2RlbF9mb29kX0hMLCBrZWVwID0gIkNtaW5fbG9hZCIpCmBgYApubyBlZmZlY3Qgb2YgQ21pbl9sb2FkCmBgYHtyfQpvcHRpb25zKGNvbnRyYXN0cz1jKCJjb250ci5zdW0iLCAiY29udHIucG9seSIpKQptb2RlbF9mb29kX0hMLjIgPC0gbG0oRklfa2NhbF9kYXlfbm9ybSB+IENtaW5fbG9hZCtTZXggKyBQcm9tZXRoaW9uX3dlaWdodF9ub3JtLCBkYXRhID0gUHJvbWV0aGlvbl9Gb29kX0hMKQpzaGFwaXJvLnRlc3QocmVzaWR1YWxzKG1vZGVsX2Zvb2RfSEwuMikpCmFub3ZhKGxtKHJlc2lkdWFscyhtb2RlbF9mb29kX0hMLjIpfmZpdHRlZC52YWx1ZXMobW9kZWxfZm9vZF9ITC4yKSkpCmBgYApgYGB7cn0KY2FyOjpBbm92YShtb2RlbF9mb29kX0hMLjIsIHRlc3Quc3RhdGlzdGljID0iRiIsIHR5cGUgPSJJSSIpCmBgYApgYGB7cn0KbW9kZWxfZm9vZF9ITC5lZmYgPC0gbG0oRklfa2NhbF9kYXkgfiBDbWluX2xvYWQrU2V4ICsgUHJvbWV0aGlvbl93ZWlnaHRfbm9ybSwgZGF0YSA9IFByb21ldGhpb25fRm9vZF9ITCkKZWZmZWN0czo6ZWZmZWN0KCJDbWluX2xvYWQiLCBtb2RlbF9mb29kX0hMLmVmZiwgc2UgPSBUUlVFKSAlPiUgYXMuZGF0YS5mcmFtZQpgYGAKYGBge3J9Cm1vZGVsX2Zvb2RfSExfcmVzaWQgPC0gbG0oRklfa2NhbF9kYXlfbm9ybSB+IFNleCArIFByb21ldGhpb25fd2VpZ2h0X25vcm0sIGRhdGEgPSBQcm9tZXRoaW9uX0Zvb2RfSEwpCgpQcm9tZXRoaW9uX0Zvb2RfSEwkRklfa2NhbF9kYXlfcmVzaWRfSEwgPC0gcmVzaWR1YWxzKG1vZGVsX2Zvb2RfSExfcmVzaWQpL3NpZ21hKG1vZGVsX2Zvb2RfSExfcmVzaWQpCgpGaWdTNl9mb29kIDwtIFByb21ldGhpb25fRm9vZF9ITCAlPiUgCiAgZHBseXI6Om11dGF0ZShDbWluX2xvYWQgPSBmYWN0b3IoQ21pbl9sb2FkLCBsZXZlbHM9IGMoIkxvdyIsICJIaWdoIikpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gQ21pbl9sb2FkLCB5ID0gRklfa2NhbF9kYXlfcmVzaWRfSEwsIHNoYXBlID0gU2V4LCBjb2xvciA9IENtaW5fbG9hZCkpICsgCiAgZ2VvbV9xdWFzaXJhbmRvbShhbHBoYSA9IDAuNywgc2l6ZSA9IDAuNzUpICsKICBzdGF0X3N1bW1hcnkoZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNpemU9MiwgYWVzKGdyb3VwID0gQ21pbl9sb2FkKSwgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNiwgc2hhcGUgPSAxNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9ITCkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBzaGFwZV9TZXgsIGxhYmVsID0gYygiRmVtYWxlIiwgIk1hbGUiKSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIkxvdyIgPSAiTG93XG5DTSIsICJIaWdoIiA9ICJIaWdoXG5DTSIpKSArCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxMCkgKwogIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgbGFicyh5ID0gIkFkai4gZm9vZCBpbnRha2UiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSkgCkZpZ1M2X2Zvb2QKYGBgCmBgYHtyfQpvcHRpb25zKGNvbnRyYXN0cz1jKCJjb250ci5zdW0iLCAiY29udHIucG9seSIpKQpzZXQuc2VlZCg2NTApClByb21ldGhpb25fRm9vZF9ITCA8LSBQcm9tZXRoaW9uX0Zvb2RfSEwgJT4lCiAgZHBseXI6Om11dGF0ZShGZWVkX2VmaWNpZW5jeV9ub3JtID0gcHJlZGljdChiZXN0Tm9ybWFsaXplKEZlZWRfZWZpY2llbmN5KSkpCgptb2RlbF9mZWVkaW5nX2VmZl9ITCA8LSBsbWVyKEZlZWRfZWZpY2llbmN5X25vcm0gfiBTZXgqQ21pbl9sb2FkICsgUHJvbWV0aGlvbl9DYWJpbmV0ICsgKDF8QmF0Y2gpLCBkYXRhID0gUHJvbWV0aGlvbl9Gb29kX0hMKQpzdGVwKG1vZGVsX2ZlZWRpbmdfZWZmX0hMKQpgYGAKYGBge3J9Cm1vZGVsX2ZlZWRpbmdfZWZmX0hMLjIgPC0gbG1lcihGZWVkX2VmaWNpZW5jeV9ub3JtIH4gQ21pbl9sb2FkICsgKDF8QmF0Y2gpLCBkYXRhID0gUHJvbWV0aGlvbl9Gb29kX0hMKQpzaGFwaXJvLnRlc3QocmVzaWR1YWxzKG1vZGVsX2ZlZWRpbmdfZWZmX0hMLjIpKQphbm92YShsbShyZXNpZHVhbHMobW9kZWxfZmVlZGluZ19lZmZfSEwuMil+Zml0dGVkLnZhbHVlcyhtb2RlbF9mZWVkaW5nX2VmZl9ITC4yKSkpCmBgYApgYGB7cn0KcGxvdChtb2RlbF9mZWVkaW5nX2VmZl9ITC4yKQpgYGAKYGBge3J9CkFub3ZhKG1vZGVsX2ZlZWRpbmdfZWZmX0hMLjIsIHR5cGUgPSJJSSIsIHRlc3Quc3RhdGlzdGljID0iRiIpCmBgYApgYGB7cn0KbW9kZWxfZmVlZGluZ19lZmZfSEwuZWZmIDwtIGxtZXIoRmVlZF9lZmljaWVuY3kgfiBDbWluX2xvYWQgKyAoMXxCYXRjaCksIGRhdGEgPSBQcm9tZXRoaW9uX0Zvb2RfSEwpCmVmZmVjdHM6OmVmZmVjdCgiQ21pbl9sb2FkIiwgbW9kZWxfZmVlZGluZ19lZmZfSEwuZWZmLCBzZSA9IFRSVUUpICU+JSBhcy5kYXRhLmZyYW1lCmBgYApgYGB7cn0KbW9kZWxfZmVlZGluZ19lZmZfSEwucmVzaWQgPC0gbG1lcihGZWVkX2VmaWNpZW5jeV9ub3JtIH4gKDF8QmF0Y2gpLCBkYXRhID0gUHJvbWV0aGlvbl9Gb29kX0hMKQoKUHJvbWV0aGlvbl9Gb29kX0hMJEZlZWRfZWZmaWNlbmN5X3Jlc2lkX0hMIDwtIHJlc2lkdWFscyhtb2RlbF9mZWVkaW5nX2VmZl9ITC5yZXNpZCkvc2lnbWEobW9kZWxfZmVlZGluZ19lZmZfSEwucmVzaWQpCgpGaWdTNl9mZWVkX2VmZiA8LSBQcm9tZXRoaW9uX0Zvb2RfSEwgJT4lCiAgZHBseXI6Om11dGF0ZShDbWluX2xvYWQgPSBmYWN0b3IoQ21pbl9sb2FkLCBsZXZlbHM9IGMoIkxvdyIsICJIaWdoIikpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gQ21pbl9sb2FkLCB5ID0gRmVlZF9lZmZpY2VuY3lfcmVzaWRfSEwsIHNoYXBlID0gU2V4LCBjb2xvciA9IENtaW5fbG9hZCkpICsgCiAgZ2VvbV9xdWFzaXJhbmRvbShhbHBoYSA9IDAuNywgc2l6ZSA9IDAuNzUpICsKICBzdGF0X3N1bW1hcnkoZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNpemU9MiwgYWVzKGdyb3VwID0gQ21pbl9sb2FkKSwgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNiwgc2hhcGUgPSAxNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9ITCkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBzaGFwZV9TZXgsIGxhYmVsID0gYygiRmVtYWxlIiwgIk1hbGUiKSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIkxvdyIgPSAiTG93XG5DTSIsICJIaWdoIiA9ICJIaWdoXG5DTSIpKSArCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxMCkgKwogIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgbGFicyh5ID0gIkFkai4gZmVlZCBlZmZpY2llbmN5IikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpIApGaWdTNl9mZWVkX2VmZgpgYGAKYGBge3J9CnNldC5zZWVkKDYyOCkKbWV0YWRhdGFfYmNfSEwgPC0gbWV0YWRhdGFfQ21pbl9ITCAlPiUKICBkcGx5cjo6c2VsZWN0KE1vdXNlSUQsIENtaW5fbG9hZCkgICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4obWV0YWRhdGFfYmMsIGJ5ID0iTW91c2VJRCIpICU+JSAKICB0aWR5cjo6ZHJvcF9uYShDbWluX2xvYWQsIGJvbWJjYWxfQ2Fsb3JpZmljX1ZhbHVlX2tjYWxfdG90YWxfZGF5KQogCgptZXRhZGF0YV9iY19ITCA8LSBtZXRhZGF0YV9iY19ITCAlPiUKICBkcGx5cjo6bXV0YXRlKGJvbWJjYWxfQ2Fsb3JpZmljX1ZhbHVlX2tjYWxfdG90YWxfZGF5X25vcm0gPSBwcmVkaWN0KGJlc3ROb3JtYWxpemUoYm9tYmNhbF9DYWxvcmlmaWNfVmFsdWVfa2NhbF90b3RhbF9kYXkpKSwKICAgICAgICAgICAgICAgIFByb21ldGhpb25fd2VpZ2h0X25vcm0gPC0gcHJlZGljdChiZXN0Tm9ybWFsaXplKFByb21ldGhpb25fd2VpZ2h0KSksIAogICAgICAgICAgICAgICAgYm9tYmNhbF9Ecnlfc2FtcGxlX21hc3Nfbm9ybSA8LSBwcmVkaWN0KGJlc3ROb3JtYWxpemUoYm9tYmNhbF9Ecnlfc2FtcGxlX21hc3MpKSkKCm1vZGVsX0JvbWJfY2FsX0hMIDwtIGxtZXJUZXN0OjpsbWVyKGJvbWJjYWxfQ2Fsb3JpZmljX1ZhbHVlX2tjYWxfdG90YWxfZGF5X25vcm0gfiBDbWluX2xvYWQqU2V4ICsgUHJvbWV0aGlvbl93ZWlnaHRfbm9ybSArKENtaW5fbG9hZHxCYXRjaC9TZXgvUHJvbWV0aGlvbl9DYWJpbmV0KSwgZGF0YSA9IG1ldGFkYXRhX2JjX0hMKQpsbWVyVGVzdDo6c3RlcChtb2RlbF9Cb21iX2NhbF9ITCwga2VlcCA9ICJDbWluX2xvYWQiKQpgYGAKYGBge3J9Cm9wdGlvbnMoY29udHJhc3RzPWMoImNvbnRyLnN1bSIsICJjb250ci5wb2x5IikpCgptb2RlbF9Cb21iX2NhbF9ITC4yIDwtIGxtZXIoYm9tYmNhbF9DYWxvcmlmaWNfVmFsdWVfa2NhbF90b3RhbF9kYXlfbm9ybSB+IENtaW5fbG9hZCArIFByb21ldGhpb25fd2VpZ2h0X25vcm0rICgxIHwgUHJvbWV0aGlvbl9DYWJpbmV0OihTZXg6QmF0Y2gpKSwgZGF0YSA9IG1ldGFkYXRhX2JjX0hMKQpzdGF0czo6c2hhcGlyby50ZXN0KHJlc2lkdWFscyhtb2RlbF9Cb21iX2NhbF9ITC4yKSkKYW5vdmEobG0ocmVzaWR1YWxzKG1vZGVsX0JvbWJfY2FsX0hMLjIpfmZpdHRlZC52YWx1ZXMobW9kZWxfQm9tYl9jYWxfSEwuMikpKQpgYGAKYGBge3J9CnBsb3QobW9kZWxfQm9tYl9jYWxfSEwuMikKYGBgCmBgYHtyfQpvcHRpb25zKGNvbnRyYXN0cz1jKCJjb250ci5zdW0iLCAiY29udHIucG9seSIpKQpjYXI6OkFub3ZhKG1vZGVsX0JvbWJfY2FsX0hMLjIsIHRlc3Quc3RhdGlzdGljPSJGIiwgdHlwZSA9ICJJSSIpCmBgYApgYGB7cn0KbW9kZWxfQm9tYl9jYWxfSExfZWZmIDwtIGxtZXIoYm9tYmNhbF9DYWxvcmlmaWNfVmFsdWVfa2NhbF90b3RhbF9kYXkgfiBDbWluX2xvYWQgKyBQcm9tZXRoaW9uX3dlaWdodF9ub3JtKyAoMSB8IFByb21ldGhpb25fQ2FiaW5ldDooU2V4OkJhdGNoKSksIGRhdGEgPSBtZXRhZGF0YV9iY19ITCkKCmVmZmVjdChjKCJDbWluX2xvYWQiKSwgbW9kZWxfQm9tYl9jYWxfSExfZWZmLCBzZSA9VFJVRSkgJT4lIGFzLmRhdGEuZnJhbWUKYGBgCmBgYHtyfQptb2RlbF9Cb21iX2NhbF9ITF9yZXNpZCA8LSBsbWVyKGJvbWJjYWxfQ2Fsb3JpZmljX1ZhbHVlX2tjYWxfdG90YWxfZGF5X25vcm0gfiBTZXggKyBQcm9tZXRoaW9uX3dlaWdodF9ub3JtKyAoMSB8IFByb21ldGhpb25fQ2FiaW5ldDooU2V4OkJhdGNoKSksIGRhdGEgPSBtZXRhZGF0YV9iY19ITCkKCm1ldGFkYXRhX2JjX0hMJGJvbWJjYWxfQ2Fsb3JpZmljX1ZhbHVlX2tjYWxfdG90YWxfZGF5X3Jlc2lkX0hMIDwtIHJlc2lkdWFscyhtb2RlbF9Cb21iX2NhbF9ITF9yZXNpZCkvc2lnbWEobW9kZWxfQm9tYl9jYWxfSExfcmVzaWQpCgpGaWdTNl9ib21iX2NhbCA8LSBtZXRhZGF0YV9iY19ITCAlPiUKICBkcm9wX25hKENtaW5fbG9hZCkgJT4lIAogIGRwbHlyOjptdXRhdGUoQ21pbl9sb2FkID0gZmFjdG9yKENtaW5fbG9hZCwgbGV2ZWxzPSBjKCJMb3ciLCAiSGlnaCIpKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IENtaW5fbG9hZCwgeSA9IGJvbWJjYWxfQ2Fsb3JpZmljX1ZhbHVlX2tjYWxfdG90YWxfZGF5X3Jlc2lkX0hMLCBzaGFwZSA9IFNleCwgY29sb3IgPSBDbWluX2xvYWQpKSArIAogIGdlb21fcXVhc2lyYW5kb20oYWxwaGEgPSAwLjcsIHNpemUgPSAwLjc1KSArCiAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaXplPTIsIGFlcyhncm91cCA9IENtaW5fbG9hZCksIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjYsIHNoYXBlID0gMTUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JfSEwpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gc2hhcGVfU2V4LCBsYWJlbCA9IGMoIkZlbWFsZSIsICJNYWxlIikpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJMb3ciID0gIkxvd1xuQ00iLCAiSGlnaCIgPSAiSGlnaFxuQ00iKSkgKwogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTApICsKICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIGxhYnMoeSA9ICJBZGouIGZlY2FsIGVuZXJneSBjb250ZW50IikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpIApGaWdTNl9ib21iX2NhbApgYGAKQmVhbSBCcmVha3MKYGBge3J9CnNldC5zZWVkKDI1OSkKClByb21ldGhpb25fYWN0aXZpdHlfSEwgPC0gbWV0YWRhdGFfQ21pbl9ITCAlPiUKICBkcGx5cjo6c2VsZWN0KE1vdXNlSUQsIENtaW5fbG9hZCkgICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4oUHJvbWV0aGlvbl9hY3Rpdml0eSwgYnkgPSJNb3VzZUlEIikgJT4lIAogIHRpZHlyOjpkcm9wX25hKENtaW5fbG9hZCwgQmVhbV9icmVha3MpCgpQcm9tZXRoaW9uX2FjdGl2aXR5X0hMJEJlYW1fYnJlYWtzX25vcm0gPC0gcHJlZGljdChiZXN0Tm9ybWFsaXplKFByb21ldGhpb25fYWN0aXZpdHlfSEwkQmVhbV9icmVha3MpKQoKb3B0aW9ucyhjb250cmFzdHM9YygiY29udHIuc3VtIiwgImNvbnRyLnBvbHkiKSkKCm1vZGVsX2JiX0hMPC0obG1lcihCZWFtX2JyZWFrc19ub3JtIH4gQ21pbl9sb2FkKlNleCArIFByb21ldGhpb25fQ2FiaW5ldCArIChDbWluX2xvYWR8QmF0Y2gpLCBQcm9tZXRoaW9uX2FjdGl2aXR5X0hMKSkKc3RlcChtb2RlbF9iYl9ITCwga2VlcCA9IkNtaW5fbG9hZCIpCmBgYAoKYGBge3J9Cm9wdGlvbnMoY29udHJhc3RzPWMoImNvbnRyLnN1bSIsICJjb250ci5wb2x5IikpCm1vZGVsX2JiX0hMLjI8LShsbWVyKEJlYW1fYnJlYWtzX25vcm0gfiBDbWluX2xvYWQgKyAoMXxCYXRjaCksIFByb21ldGhpb25fYWN0aXZpdHlfSEwpKQpzdGF0czo6c2hhcGlyby50ZXN0KHJlc2lkKG1vZGVsX2JiX0hMLjIpKQphbm92YShsbShyZXNpZHVhbHMobW9kZWxfYmJfSEwuMil+Zml0dGVkLnZhbHVlcyhtb2RlbF9iYl9ITC4yKSkpCmBgYApgYGB7cn0KcGxvdChtb2RlbF9iYl9ITC4yKQpgYGAKYGBge3J9CmNhcjo6QW5vdmEobW9kZWxfYmJfSEwuMiwgdGVzdC5zdGF0aXN0aWMgPSJGIiwgdHlwZSA9IklJIikKYGBgCmBgYHtyfQptb2RlbF9iYl9ITC5lZmY8LShsbWVyKEJlYW1fYnJlYWtzIH4gQ21pbl9sb2FkICsgKDF8QmF0Y2gpLCBQcm9tZXRoaW9uX2FjdGl2aXR5X0hMKSkKZWZmZWN0czo6ZWZmZWN0KCJDbWluX2xvYWQiLCBtb2RlbF9iYl9ITC5lZmYsIHNlID1UUlVFKSAlPiUgYXMuZGF0YS5mcmFtZSgpCmBgYApgYGB7cn0KbW9kZWxfYmJfSEwucmVzaWQ8LShsbWVyVGVzdDo6bG1lcihCZWFtX2JyZWFrc19ub3JtIH4gKDEgfCBCYXRjaCksIFByb21ldGhpb25fYWN0aXZpdHlfSEwpKQoKUHJvbWV0aGlvbl9hY3Rpdml0eV9ITCRCZWFtQnJlYWtzX0hMX3Jlc2lkIDwtIHJlc2lkdWFscyhtb2RlbF9iYl9ITC5yZXNpZCkvc2lnbWEobW9kZWxfYmJfSEwucmVzaWQpCgpGaWdTNl9iYl9ITCA8LSBQcm9tZXRoaW9uX2FjdGl2aXR5X0hMICU+JQogIGRyb3BfbmEoQ21pbl9sb2FkKSAlPiUgCiAgZHBseXI6Om11dGF0ZShDbWluX2xvYWQgPSBmYWN0b3IoQ21pbl9sb2FkLCBsZXZlbHM9IGMoIkxvdyIsICJIaWdoIikpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gQ21pbl9sb2FkLCB5ID0gQmVhbV9icmVha3Nfbm9ybSwgc2hhcGUgPSBTZXgsIGNvbG9yID0gQ21pbl9sb2FkKSkgKyAKICBnZW9tX3F1YXNpcmFuZG9tKGFscGhhID0gMC43LCBzaXplID0gMC43NSkgKwogIHN0YXRfc3VtbWFyeShmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2l6ZT0yLCBhZXMoZ3JvdXAgPSBDbWluX2xvYWQpLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC42LCBzaGFwZSA9IDE1KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX0hMKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IHNoYXBlX1NleCwgbGFiZWwgPSBjKCJGZW1hbGUiLCAiTWFsZSIpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiTG93IiA9ICJMb3dcbkNNIiwgIkhpZ2giID0gIkhpZ2hcbkNNIikpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDEwKSArCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICBsYWJzKHkgPSAiQWRqLiBiZWFtIGJyZWFrcyIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKSAKRmlnUzZfYmJfSEwKYGBgCkRpc3RhbmNlIHRyYXZlbGVkCmBgYHtyfQpzZXQuc2VlZCgzMTIpIApQcm9tZXRoaW9uX2FjdGl2aXR5X0hMJERpc3RhbmNlX3RyYXZlbGVkX25vcm08LSBwcmVkaWN0KGJlc3ROb3JtYWxpemUoUHJvbWV0aGlvbl9hY3Rpdml0eV9ITCREaXN0YW5jZV90cmF2ZWxlZCkpCgptb2RlbF9kaXN0YW5jZV9ITDwtKGxtZXIoRGlzdGFuY2VfdHJhdmVsZWRfbm9ybSB+IENtaW5fbG9hZCpTZXggKyBQcm9tZXRoaW9uX0NhYmluZXQgKyAoQ21pbl9sb2FkfEJhdGNoKSwgUHJvbWV0aGlvbl9hY3Rpdml0eV9ITCkpCmxtZXJUZXN0OjpzdGVwKG1vZGVsX2Rpc3RhbmNlX0hMLCBrZWVwID0gIkNtaW5fbG9hZCIpCmBgYApgYGB7cn0KbW9kZWxfZGlzdGFuY2VfSEwuMjwtKGxtZXIoRGlzdGFuY2VfdHJhdmVsZWRfbm9ybSB+IENtaW5fbG9hZCpTZXggKyAoMXxCYXRjaCksIFByb21ldGhpb25fYWN0aXZpdHlfSEwpKQpzaGFwaXJvLnRlc3QocmVzaWR1YWxzKG1vZGVsX2Rpc3RhbmNlX0hMLjIpKQphbm92YShsbShyZXNpZHVhbHMobW9kZWxfZGlzdGFuY2VfSEwuMil+Zml0dGVkLnZhbHVlcyhtb2RlbF9kaXN0YW5jZV9ITC4yKSkpCmBgYApgYGB7cn0KY2FyOjpBbm92YShtb2RlbF9kaXN0YW5jZV9ITC4yLCB0eXBlID0iSUlJIiwgdGVzdC5zdGF0aXN0aWMgPSJGIikKYGBgCmBgYHtyfQplbW1lYW5zOjpqb2ludF90ZXN0cyhtb2RlbF9kaXN0YW5jZV9ITC4yLCBieSA9IlNleCIpCmBgYApgYGB7cn0KbW9kZWxfZGlzdGFuY2VfSEwuZWZmPC0obG1lcihEaXN0YW5jZV90cmF2ZWxlZCB+IENtaW5fbG9hZCpTZXggICsgKDF8QmF0Y2gpLCBQcm9tZXRoaW9uX2FjdGl2aXR5X0hMKSkKZWZmZWN0czo6ZWZmZWN0KCJDbWluX2xvYWQqU2V4IiwgbW9kZWxfZGlzdGFuY2VfSEwuZWZmLCBzZSA9VFJVRSkgJT4lIGFzLmRhdGEuZnJhbWUKYGBgCmBgYHtyfQptb2RlbF9kaXN0YW5jZV9ITC5yZXNpZCA8LShsbWVyKERpc3RhbmNlX3RyYXZlbGVkX25vcm0gfiBTZXggKyAoMXxCYXRjaCksIFByb21ldGhpb25fYWN0aXZpdHlfSEwpKQoKUHJvbWV0aGlvbl9hY3Rpdml0eV9ITCREaXN0YW5jZV90cmF2ZWxlZF9yZXNpZF9ITCA8LSByZXNpZHVhbHMobW9kZWxfZGlzdGFuY2VfSEwucmVzaWQpL3NpZ21hKG1vZGVsX2Rpc3RhbmNlX0hMLnJlc2lkKQoKRmlnUzZfZGlzdGFuY2VfSEwgPC0gUHJvbWV0aGlvbl9hY3Rpdml0eV9ITCAlPiUKICBkcm9wX25hKENtaW5fbG9hZCkgJT4lIAogIGRwbHlyOjptdXRhdGUoQ21pbl9sb2FkID0gZmFjdG9yKENtaW5fbG9hZCwgbGV2ZWxzPSBjKCJMb3ciLCAiSGlnaCIpKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IENtaW5fbG9hZCwgeSA9IERpc3RhbmNlX3RyYXZlbGVkX3Jlc2lkX0hMLCBzaGFwZSA9IFNleCwgY29sb3IgPSBDbWluX2xvYWQpKSArIAogIGdlb21fcXVhc2lyYW5kb20oYWxwaGEgPSAwLjcsIHNpemUgPSAwLjc1KSArCiAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaXplPTIsIGFlcyhncm91cCA9IENtaW5fbG9hZCksIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjYsIHNoYXBlID0gMTUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JfSEwpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gc2hhcGVfU2V4LCBsYWJlbCA9IGMoIkZlbWFsZSIsICJNYWxlIikpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJMb3ciID0gIkxvd1xuQ00iLCAiSGlnaCIgPSAiSGlnaFxuQ00iKSkgKwogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTApICsKICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIGxhYnMoeSA9ICJBZGouIGRpc3RhbmNlIHRyYXZlbGVkIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpICArIAogIGZhY2V0X2dyaWQoLn5TZXgpIApGaWdTNl9kaXN0YW5jZV9ITApgYGAKYGBge3J9CkZpZ1M2X0hMX2xlZ2VuZCA8LSBjb3dwbG90OjpnZXRfbGVnZW5kKG1ldGFkYXRhX0NtaW5fSEwgJT4lIAogIGRwbHlyOjptdXRhdGUoU2V4ID0gaWZlbHNlKFNleCA9PSAiRiIsICJGZW1hbGUiLCAiTWFsZSIpLCBDbWluX2xvYWQgPSBpZmVsc2UoQ21pbl9sb2FkID09ICJMb3ciLCAiTG93LUNNIiwgIkhpZ2gtQ00iKSkgJT4lCiAgZHBseXI6Om11dGF0ZShTZXhfQ21pbl9sb2FkID0gcGFzdGUoU2V4LCBDbWluX2xvYWQsIHNlcCA9ICIgIikpICU+JQogIGdncGxvdCgpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gU2V4X0NtaW5fbG9hZCwgeSA9IHFQQ1JfQ21pbl9wZXJfZ0NDLCBzaGFwZSA9IFNleF9DbWluX2xvYWQsIGNvbG9yID0gU2V4X0NtaW5fbG9hZCksIHNpemUgPTMgLCBhbHBoYSA9MSwKICAgICAgICAgICAgIHNob3cubGVnZW5kID0gVCkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXM9YygxNiwgMTYsNCwgNCkpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz0gYyhjb2xvcl9ITCwgY29sb3JfSEwpKSArCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxMCkgKwogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkpCgoKRmlnUzZfYWxpZ24gPC0gY293cGxvdDo6YWxpZ25fcGxvdHMoRmlnUzZfaGlnaF9Mb3cgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWdTNl9mb29kICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlnUzZfZmVlZF9lZmYgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWdTNl9ib21iX2NhbCArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWdTNl9iYl9ITCArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWdTNl9kaXN0YW5jZV9ITCArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduID0gJ3YnLCBheGlzID0gJ2wnKQoKRmlnUzZfMSA8LSBjb3dwbG90OjpwbG90X2dyaWQoRmlnUzZfYWxpZ25bWzFdXSwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlnUzZfYWxpZ25bWzJdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWdTNl9hbGlnbltbM11dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZ1M2X2FsaWduW1s0XV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbD00LCBucm93PTEsIGxhYmVscyA9IGMoIkEiLCAiQiIsICJDIiwgIkQiKSwgbGFiZWxfc2l6ZSA9IDEyLCByZWxfd2lkdGhzID0gYygxLDEsMSwxKSkKRmlnUzZfMiA8LSBjb3dwbG90OjpwbG90X2dyaWQoTkEsICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZ1M2X2FsaWduW1s1XV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlnUzZfYWxpZ25bWzZdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWdTNl9ITF9sZWdlbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sPTUsIG5yb3c9MSwgbGFiZWxzID0gYyhOQSwgIkUiLCBOQSwgIkYiLCBOQSksIGxhYmVsX3NpemUgPSAxMiwgcmVsX3dpZHRocyA9IGMoMC4zLDEsMC4zLDEuOCwwLjgpKQpGaWd1cmVTNiA8LSBjb3dwbG90OjpwbG90X2dyaWQoRmlnUzZfMSwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlnUzZfMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sPTEsIG5yb3c9MiwgcmVsX2hlaWdodHMgPSBjKDEsMSkpCmBgYApgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0gNH0KRmlndXJlUzYKYGBgCmBgYHtyIGV2YWwgPSBGQUxTRX0KZ2dzYXZlKCIuL0ZpZ3VyZVM2LnBkZiIsIHBsb3QgPSBGaWd1cmVTNiwgZGV2aWNlID0gY2Fpcm9fcGRmLCAgCiAgd2lkdGggPSAxNS41LAogIGhlaWdodCA9IDEwLjUsCiAgdW5pdHMgPSAiY20iKQpgYGAKCiMjIyBGaWd1cmVTNwpgYGB7cn0Kc2V0LnNlZWQoNzU5KQoKbWV0YWRhdGFfQ21pbl9ITF9xUENSIDwtIG1ldGFkYXRhX0NtaW5fSEwgJT4lCiAgdGlkeXI6OmRyb3BfbmEoQ21pbl9sb2FkLCBxUENSXzE2U19TUV9wZXJfZ0NDKSAlPiUKICBkcGx5cjo6bXV0YXRlKHFQQ1JfMTZTX1NRX3Blcl9nQ0Nfbm9ybSA9IHByZWRpY3QoYmVzdE5vcm1hbGl6ZShxUENSXzE2U19TUV9wZXJfZ0NDKSkpCgptb2RlbF9xUENSMTZTX0hMPC0gbG1lclRlc3Q6OmxtZXIocVBDUl8xNlNfU1FfcGVyX2dDQ19ub3JtIH4gQ21pbl9sb2FkKlNleCArIFQ2X3dlaWdodCArIFBsYXRlICsgKDF8cVBDUl9Sb3VuZC9CYXRjaC9TZXgpLCBkYXRhID0gbWV0YWRhdGFfQ21pbl9ITF9xUENSKQpsbWVyVGVzdDo6c3RlcChtb2RlbF9xUENSMTZTX0hMLCBrZWVwID0gIkNtaW5fbG9hZCIpCmBgYApgYGB7cn0KbW9kZWxfcVBDUjE2U19ITC4yPC0gbG1lcihxUENSXzE2U19TUV9wZXJfZ0NDX25vcm0gfiBDbWluX2xvYWQgKyBQbGF0ZSArICgxIHwgQmF0Y2g6cVBDUl9Sb3VuZCksIGRhdGEgPSBtZXRhZGF0YV9DbWluX0hMX3FQQ1IpCgpzaGFwaXJvLnRlc3QocmVzaWR1YWxzKG1vZGVsX3FQQ1IxNlNfSEwuMikpCmFub3ZhKGxtKHJlc2lkdWFscyhtb2RlbF9xUENSMTZTX0hMLjIpIH4gZml0dGVkKG1vZGVsX3FQQ1IxNlNfSEwuMikpKSAKYGBgCmBgYHtyfQpwbG90KG1vZGVsX3FQQ1IxNlNfSEwuMikKYGBgCmBgYHtyfQpjYXI6OkFub3ZhKG1vZGVsX3FQQ1IxNlNfSEwuMiwgdHlwZSA9ICJJSSIsIHRlc3Quc3RhdGlzdGljID0iRiIpCmBgYApgYGB7cn0KbW9kZWxfcVBDUjE2U19ITC5lZmY8LSBsbWVyKHFQQ1JfMTZTX1NRX3Blcl9nQ0N+IENtaW5fbG9hZCArIFBsYXRlICsgKDEgfCBCYXRjaDpxUENSX1JvdW5kKSwgZGF0YSA9IG1ldGFkYXRhX0NtaW5fSExfcVBDUikKZWZmZWN0czo6ZWZmZWN0KCJDbWluX2xvYWQiLCBtb2RlbF9xUENSMTZTX0hMLmVmZiwgc2UgPVRSVUUpICU+JSBhcy5kYXRhLmZyYW1lCmBgYApgYGB7cn0KRmlnUzdfbWJpb21hc3NfSEwgPC0gbWV0YWRhdGFfQ21pbl9ITF9xUENSICU+JQogIGRyb3BfbmEoQ21pbl9sb2FkKSAlPiUgCiAgZHBseXI6Om11dGF0ZShDbWluX2xvYWQgPSBmYWN0b3IoQ21pbl9sb2FkLCBsZXZlbHM9IGMoIkxvdyIsICJIaWdoIikpKSAlPiUgCiAgZHBseXI6Om11dGF0ZShxUENSXzE2U19TUV9wZXJfZ0NDX2UxMCA9IHFQQ1JfMTZTX1NRX3Blcl9nQ0MvMWUxMCkgJT4lIAogIGdncGxvdChhZXMoeCA9IENtaW5fbG9hZCwgeSA9IHFQQ1JfMTZTX1NRX3Blcl9nQ0NfZTEwLCBzaGFwZSA9IFNleCwgY29sb3IgPSBDbWluX2xvYWQpKSArIAogIGdlb21fcXVhc2lyYW5kb20oYWxwaGEgPSAwLjcsIHNpemUgPSAwLjc1KSArCiAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaXplPTIsIGFlcyhncm91cCA9IENtaW5fbG9hZCksIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjYsIHNoYXBlID0gMTUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JfSEwsIGxhYmVsID0gYygiTG93LUNNIiwgIkhpZ2gtQ00iKSwgbmFtZSA9ICJUcmVhdG1lbnQiKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IHNoYXBlX1NleCwgbGFiZWwgPSBjKCJGZW1hbGUiLCAiTWFsZSIpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiTG93IiA9ICJMb3dcbkNNIiwgIkhpZ2giID0gIkhpZ2hcbkNNIikpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDEwKSArCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICBsYWJzKHkgPSBleHByZXNzaW9uKHBhc3RlKCJNaWNyb2JlcyAoR0UvZykgeCAiLCBlXjEwKSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKSAKRmlnUzdfbWJpb21hc3NfSEwKYGBgCmJvbWJjYWwgfiBtaWNyb2JpYWwgYmlvbWFzcy9jbWluCmBgYHtyfQpvcHRpb25zKGNvbnRyYXN0cz1jKCJjb250ci5zdW0iLCAiY29udHIucG9seSIpKQpzZXQuc2VlZCgyNTkpCm1ldGFkYXRhX0NtaW5fSExfcVBDUl9iYyA8LSBtZXRhZGF0YV9DbWluX0hMX3FQQ1IgJT4lCiAgZHBseXI6OnNlbGVjdChNb3VzZUlELCBxUENSXzE2U19TUV9wZXJfZ0NDLCBxUENSX0NtaW5fU1FfcGVyX2dDQywgcVBDUl9Sb3VuZCkgJT4lCiAgZHBseXI6OmxlZnRfam9pbihtZXRhZGF0YV9iY19ITCwgYnkgPSJNb3VzZUlEIikgJT4lCiAgdGlkeXI6OmRyb3BfbmEoYm9tYmNhbF9DYWxvcmlmaWNfVmFsdWVfa2NhbF90b3RhbF9kYXkpICU+JQogIGRwbHlyOjptdXRhdGUocVBDUl8xNlNfU1FfcGVyX2dDQ19ub3JtID0gcHJlZGljdChiZXN0Tm9ybWFsaXplKHFQQ1JfMTZTX1NRX3Blcl9nQ0MpKSwgCiAgICAgICAgICAgICAgICBxUENSX0NtaW5fU1FfcGVyX2dDQ19ub3JtID0gcHJlZGljdChiZXN0Tm9ybWFsaXplKHFQQ1JfQ21pbl9TUV9wZXJfZ0NDKSksIAogICAgICAgICAgICAgICAgYm9tYmNhbF9DYWxvcmlmaWNfVmFsdWVfa2NhbF90b3RhbF9kYXlfbm9ybSA9IHByZWRpY3QoYmVzdE5vcm1hbGl6ZShib21iY2FsX0NhbG9yaWZpY19WYWx1ZV9rY2FsX3RvdGFsX2RheSkpLCAKICAgICAgICAgICAgICAgIFByb21ldGhpb25fd2VpZ2h0X25vcm0gPSBwcmVkaWN0KGJlc3ROb3JtYWxpemUoUHJvbWV0aGlvbl93ZWlnaHQpKSkKCm1vZGVsX2JvbWJjYWxfQ21pbiA8LSBsbWVyVGVzdDo6bG1lcihib21iY2FsX0NhbG9yaWZpY19WYWx1ZV9rY2FsX3RvdGFsX2RheV9ub3JtIH4gcVBDUl9DbWluX1NRX3Blcl9nQ0Nfbm9ybSpTZXggKyBxUENSX1JvdW5kICsgUHJvbWV0aGlvbl93ZWlnaHRfbm9ybSArKDF8QmF0Y2gvU2V4L1Byb21ldGhpb25fQ2FiaW5ldCksIGRhdGEgPSBtZXRhZGF0YV9DbWluX0hMX3FQQ1JfYmMpCmxtZXJUZXN0OjpzdGVwKG1vZGVsX2JvbWJjYWxfQ21pbikKCm1vZGVsX2JvbWJjYWxfYmlvbWFzcyA8LSBsbWVyVGVzdDo6bG1lcihib21iY2FsX0NhbG9yaWZpY19WYWx1ZV9rY2FsX3RvdGFsX2RheV9ub3JtIH4gcVBDUl8xNlNfU1FfcGVyX2dDQ19ub3JtKlNleCArIHFQQ1JfUm91bmQgKyBQcm9tZXRoaW9uX3dlaWdodF9ub3JtICsoMXxCYXRjaC9TZXgvUHJvbWV0aGlvbl9DYWJpbmV0KSwgZGF0YSA9IG1ldGFkYXRhX0NtaW5fSExfcVBDUl9iYykKbG1lclRlc3Q6OnN0ZXAobW9kZWxfYm9tYmNhbF9iaW9tYXNzKQpgYGAKYGBge3J9Cm1vZGVsX2JvbWJjYWxfQ21pbi4yIDwtIGxtZXJUZXN0OjpsbWVyKGJvbWJjYWxfQ2Fsb3JpZmljX1ZhbHVlX2tjYWxfdG90YWxfZGF5X25vcm0gfiBxUENSX0NtaW5fU1FfcGVyX2dDQ19ub3JtICsgUHJvbWV0aGlvbl93ZWlnaHRfbm9ybSArICgxIHwgUHJvbWV0aGlvbl9DYWJpbmV0OihTZXg6QmF0Y2gpKSwgZGF0YSA9IG1ldGFkYXRhX0NtaW5fSExfcVBDUl9iYykKbW9kZWxfYm9tYmNhbF9iaW9tYXNzLjIgPC0gbG1lclRlc3Q6OmxtZXIoYm9tYmNhbF9DYWxvcmlmaWNfVmFsdWVfa2NhbF90b3RhbF9kYXlfbm9ybSB+IHFQQ1JfMTZTX1NRX3Blcl9nQ0Nfbm9ybSArIFByb21ldGhpb25fd2VpZ2h0X25vcm0gKyAoMSB8IFByb21ldGhpb25fQ2FiaW5ldDooU2V4OkJhdGNoKSksIGRhdGEgPSBtZXRhZGF0YV9DbWluX0hMX3FQQ1JfYmMpCgpzaGFwaXJvLnRlc3QocmVzaWR1YWxzKG1vZGVsX2JvbWJjYWxfQ21pbi4yKSkKc2hhcGlyby50ZXN0KHJlc2lkdWFscyhtb2RlbF9ib21iY2FsX2Jpb21hc3MuMikpCgphbm92YShsbShyZXNpZHVhbHMobW9kZWxfYm9tYmNhbF9DbWluLjIpfmZpdHRlZC52YWx1ZXMobW9kZWxfYm9tYmNhbF9DbWluLjIpKSkKYW5vdmEobG0ocmVzaWR1YWxzKG1vZGVsX2JvbWJjYWxfYmlvbWFzcy4yKX5maXR0ZWQudmFsdWVzKG1vZGVsX2JvbWJjYWxfYmlvbWFzcy4yKSkpCgpjYXI6OkFub3ZhKG1vZGVsX2JvbWJjYWxfQ21pbi4yLCB0ZXN0LnN0YXRpc3RpYyA9IkYiLCB0eXBlID0iSUkiKQpjYXI6OkFub3ZhKG1vZGVsX2JvbWJjYWxfYmlvbWFzcy4yLCB0ZXN0LnN0YXRpc3RpYyA9IkYiLCB0eXBlID0iSUkiKQoKCnIyX21vZGVsX2JvbWJjYWxfQ21pbl9tYXI8LSBwYXJ0UjIobW9kZWxfYm9tYmNhbF9DbWluLjIsIHBhcnR2YXJzID0gYygicVBDUl9DbWluX1NRX3Blcl9nQ0Nfbm9ybSIpLCAKICAgICAgICAgICAgICAgICAgUjJfdHlwZSA9ICJtYXJnaW5hbCIsIG5ib290ID0gMTApCnIyX21vZGVsX2JvbWJjYWxfQ21pbl9tYXIkUjIgJT4lIGRwbHlyOjpmaWx0ZXIodGVybSA9PSAicVBDUl9DbWluX1NRX3Blcl9nQ0Nfbm9ybSIpICU+JSBkcGx5cjo6c2VsZWN0KGVzdGltYXRlKSAlPiUgcHVsbCgpCgoKcjJfbW9kZWxfYm9tYmNhbF9iaW9tYXNzX21hcjwtIHBhcnRSMihtb2RlbF9ib21iY2FsX2Jpb21hc3MuMiwgcGFydHZhcnMgPSBjKCJxUENSXzE2U19TUV9wZXJfZ0NDX25vcm0iKSwgCiAgICAgICAgICAgICAgICAgIFIyX3R5cGUgPSAibWFyZ2luYWwiLCBuYm9vdCA9IDEwKQpyMl9tb2RlbF9ib21iY2FsX2Jpb21hc3NfbWFyJFIyICU+JSBkcGx5cjo6ZmlsdGVyKHRlcm0gPT0gInFQQ1JfMTZTX1NRX3Blcl9nQ0Nfbm9ybSIpICU+JSBkcGx5cjo6c2VsZWN0KGVzdGltYXRlKSAlPiUgcHVsbCgpCmBgYApgYGB7cn0KbW9kZWxfYm9tYmNhbF9ITF9yZXNpZCA8LSBsbWVyKGJvbWJjYWxfQ2Fsb3JpZmljX1ZhbHVlX2tjYWxfdG90YWxfZGF5X25vcm0gfiBTZXggKyBQcm9tZXRoaW9uX3dlaWdodF9ub3JtKyAoMSB8IFByb21ldGhpb25fQ2FiaW5ldDooU2V4OkJhdGNoKSksIGRhdGEgPSBtZXRhZGF0YV9DbWluX0hMX3FQQ1JfYmMpCm1ldGFkYXRhX0NtaW5fSExfcVBDUl9iYyRib21iY2FsX0NhbG9yaWZpY19WYWx1ZV9rY2FsX3RvdGFsX2RheV9yZXNpZCA8LSByZXNpZHVhbHMobW9kZWxfYm9tYmNhbF9ITF9yZXNpZCkvc2lnbWEobW9kZWxfYm9tYmNhbF9ITF9yZXNpZCkKCkZpZ1M3X2Jpb21hc3NfYmM8LSBtZXRhZGF0YV9DbWluX0hMX3FQQ1JfYmMgJT4lCiAgZ2dwbG90KGFlcyh4PSBxUENSXzE2U19TUV9wZXJfZ0NDX25vcm0gLHk9Ym9tYmNhbF9DYWxvcmlmaWNfVmFsdWVfa2NhbF90b3RhbF9kYXlfcmVzaWQpKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGLCAgYWxwaGEgPSAwLjgsIHNpemUgPSAwLjUsIGNvbG9yID0iYmxhY2siKSsgCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBDbWluX2xvYWQsIHNoYXBlID0gU2V4KSwgYWxwaGEgPTAuNywgc2l6ZSA9MC43NSwgc2hvdy5sZWdlbmQgPSBUKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1zaGFwZV9TZXgsIGxhYmVsID0gYygiRmVtYWxlIiwgIk1hbGUiKSxuYW1lID0gIlNleCIpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jb2xvcl9ITCwgbGFiZWwgPSBjKGV4cHJlc3Npb24oaXRhbGljKCJMb3ctQ00iKSksIGV4cHJlc3Npb24oaXRhbGljKCJIaWdoLUNNIikpKSwgbmFtZSA9ICJHcm91cCIpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDEwKSArCiAgbGFicyh4ID0gIk5vcm0uIG1pY3JvYmVzIiwgeSA9ICJBZGouIGZlY2FsIGVuZXJneVxuY29udGVudCIpIApGaWdTN19iaW9tYXNzX2JjCgpGaWdTN19jbWluX2JjPC0gbWV0YWRhdGFfQ21pbl9ITF9xUENSX2JjICU+JQogIGdncGxvdChhZXMoeD0gcVBDUl9DbWluX1NRX3Blcl9nQ0Nfbm9ybSAseT1ib21iY2FsX0NhbG9yaWZpY19WYWx1ZV9rY2FsX3RvdGFsX2RheV9yZXNpZCkpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEYsICBhbHBoYSA9IDAuOCwgc2l6ZSA9IDAuNSwgY29sb3IgPSJibGFjayIpKyAKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IENtaW5fbG9hZCwgc2hhcGUgPSBTZXgpLCBhbHBoYSA9MC43LCBzaXplID0wLjc1LCBzaG93LmxlZ2VuZCA9IFQpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzPXNoYXBlX1NleCwgbGFiZWwgPSBjKCJGZW1hbGUiLCAiTWFsZSIpLG5hbWUgPSAiU2V4IikgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWNvbG9yX0hMLCBsYWJlbCA9IGMoZXhwcmVzc2lvbihpdGFsaWMoIkxvdy1DTSIpKSwgZXhwcmVzc2lvbihpdGFsaWMoIkhpZ2gtQ00iKSkpLCBuYW1lID0gIkdyb3VwIikgKwogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTApICsKICBsYWJzKHggPSAiTm9ybS4gQy4gbWludXRhIiwgeSA9ICJBZGouIGZlY2FsIGVuZXJneVxuY29udGVudCIpCkZpZ1M3X2NtaW5fYmMKYGBgCmFscGhhIGhMCmBgYHtyfQpBbHBoYV9kaXZfSEwgPC0gbWV0YWRhdGFfQ21pbl9ITCAlPiUKICBkcGx5cjo6c2VsZWN0KE1vdXNlSUQsIENtaW5fbG9hZCkgICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4oQWxwaGFfZGl2LCBieSA9Ik1vdXNlSUQiKSAlPiUgCiAgdGlkeXI6OmRyb3BfbmEoQ21pbl9sb2FkLCBzaGFubm9uX2VudHJvcHkpCgpBbHBoYV9kaXZfSExfTSA8LSBBbHBoYV9kaXZfSEwgJT4lIAogIGZpbHRlcihTZXggPT0iTSIpCkFscGhhX2Rpdl9ITF9GIDwtIEFscGhhX2Rpdl9ITCAlPiUgCiAgZmlsdGVyKFNleCA9PSJGIikKCndpbGNveC50ZXN0KHNoYW5ub25fZW50cm9weX5DbWluX2xvYWQsIGRhdGEgPSBBbHBoYV9kaXZfSExfTSwgZXhhY3QgPSBGQUxTRSwgY29ycmVjdCA9IEZBTFNFLCBjb25mLmludCA9IEZBTFNFKQp3aWxjb3gudGVzdChzaGFubm9uX2VudHJvcHl+Q21pbl9sb2FkLCBkYXRhID0gQWxwaGFfZGl2X0hMX0YsIGV4YWN0ID0gRkFMU0UsIGNvcnJlY3QgPSBGQUxTRSwgY29uZi5pbnQgPSBGQUxTRSkKCndpbGNveC50ZXN0KHBpZWxvdV9ldmVubmVzc35DbWluX2xvYWQsIGRhdGEgPSBBbHBoYV9kaXZfSExfTSwgZXhhY3QgPSBGQUxTRSwgY29ycmVjdCA9IEZBTFNFLCBjb25mLmludCA9IEZBTFNFKQp3aWxjb3gudGVzdChwaWVsb3VfZXZlbm5lc3N+Q21pbl9sb2FkLCBkYXRhID0gQWxwaGFfZGl2X0hMX0YsIGV4YWN0ID0gRkFMU0UsIGNvcnJlY3QgPSBGQUxTRSwgY29uZi5pbnQgPSBGQUxTRSkKCndpbGNveC50ZXN0KGZhaXRoX3BkfkNtaW5fbG9hZCwgZGF0YSA9IEFscGhhX2Rpdl9ITF9NLCBleGFjdCA9IEZBTFNFLCBjb3JyZWN0ID0gRkFMU0UsIGNvbmYuaW50ID0gRkFMU0UpCndpbGNveC50ZXN0KGZhaXRoX3BkfkNtaW5fbG9hZCwgZGF0YSA9IEFscGhhX2Rpdl9ITF9GLCBleGFjdCA9IEZBTFNFLCBjb3JyZWN0ID0gRkFMU0UsIGNvbmYuaW50ID0gRkFMU0UpCgp3aWxjb3gudGVzdChvYnNlcnZlZF9mZWF0dXJlc35DbWluX2xvYWQsIGRhdGEgPSBBbHBoYV9kaXZfSExfTSwgZXhhY3QgPSBGQUxTRSwgY29ycmVjdCA9IEZBTFNFLCBjb25mLmludCA9IEZBTFNFKQp3aWxjb3gudGVzdChvYnNlcnZlZF9mZWF0dXJlc35DbWluX2xvYWQsIGRhdGEgPSBBbHBoYV9kaXZfSExfRiwgZXhhY3QgPSBGQUxTRSwgY29ycmVjdCA9IEZBTFNFLCBjb25mLmludCA9IEZBTFNFKQpgYGAKLS0+IHNleC1kaW1vcnBoaWMgZWZmZWN0cyBnb25lISAKLS0+IGFuYWx5c2VzIGJ5IGdyb3VwIG5vdCBzZXBhcmF0ZWQgYnkgc2V4IGFueW1vcmUhIApgYGB7cn0Kd2lsY294LnRlc3Qoc2hhbm5vbl9lbnRyb3B5fkNtaW5fbG9hZCwgZGF0YSA9IEFscGhhX2Rpdl9ITCwgZXhhY3QgPSBGQUxTRSwgY29ycmVjdCA9IEZBTFNFLCBjb25mLmludCA9IEZBTFNFKQp3aWxjb3gudGVzdChwaWVsb3VfZXZlbm5lc3N+Q21pbl9sb2FkLCBkYXRhID0gQWxwaGFfZGl2X0hMLCBleGFjdCA9IEZBTFNFLCBjb3JyZWN0ID0gRkFMU0UsIGNvbmYuaW50ID0gRkFMU0UpCndpbGNveC50ZXN0KGZhaXRoX3BkfkNtaW5fbG9hZCwgZGF0YSA9IEFscGhhX2Rpdl9ITCwgZXhhY3QgPSBGQUxTRSwgY29ycmVjdCA9IEZBTFNFLCBjb25mLmludCA9IEZBTFNFKQp3aWxjb3gudGVzdChvYnNlcnZlZF9mZWF0dXJlc35DbWluX2xvYWQsIGRhdGEgPSBBbHBoYV9kaXZfSEwsIGV4YWN0ID0gRkFMU0UsIGNvcnJlY3QgPSBGQUxTRSwgY29uZi5pbnQgPSBGQUxTRSkKYGBgCgpgYGB7cn0KbWVhbl9zZV9ITCA8LSBBbHBoYV9kaXZfSEwgJT4lCiAgZHBseXI6Omdyb3VwX2J5KENtaW5fbG9hZCkgJT4lCiAgZHBseXI6OnN1bW1hcmlzZShtZWFuID0gbWVhbihzaGFubm9uX2VudHJvcHkpLCBzZSA9IHN0YW5kYXJkX2Vycm9yKHNoYW5ub25fZW50cm9weSkpJT4lCiAgZHBseXI6Om11dGF0ZShhbHBoYSA9ICJzZSIpCgptZWFuX3BlX0hMIDwtIEFscGhhX2Rpdl9ITCAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoQ21pbl9sb2FkKSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKG1lYW4gPSBtZWFuKHBpZWxvdV9ldmVubmVzcyksIHNlID0gc3RhbmRhcmRfZXJyb3IocGllbG91X2V2ZW5uZXNzKSklPiUKICBkcGx5cjo6bXV0YXRlKGFscGhhID0gInBlIikKCm1lYW5fZmRwX0hMIDwtIEFscGhhX2Rpdl9ITCAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoQ21pbl9sb2FkKSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKG1lYW4gPSBtZWFuKGZhaXRoX3BkKSwgc2UgPSBzdGFuZGFyZF9lcnJvcihmYWl0aF9wZCkpJT4lCiAgZHBseXI6Om11dGF0ZShhbHBoYSA9ICJmZHAiKQoKbWVhbl9vZl9ITCA8LSBBbHBoYV9kaXZfSEwgJT4lCiAgZHBseXI6Omdyb3VwX2J5KENtaW5fbG9hZCkgJT4lCiAgZHBseXI6OnN1bW1hcmlzZShtZWFuID0gbWVhbihvYnNlcnZlZF9mZWF0dXJlcyksIHNlID0gc3RhbmRhcmRfZXJyb3Iob2JzZXJ2ZWRfZmVhdHVyZXMpKSU+JQogIGRwbHlyOjptdXRhdGUoYWxwaGEgPSAib2YiKQoKcmJpbmQobWVhbl9zZV9ITCwgbWVhbl9wZV9ITCwgbWVhbl9mZHBfSEwsIG1lYW5fb2ZfSEwpCmBgYApgYGB7cn0KRmlnUzdfYWxwaGFfSExfTVIgPC0gQWxwaGFfZGl2X0hMICU+JSAKICBkcm9wX25hKENtaW5fbG9hZCkgJT4lIAogIGRwbHlyOjptdXRhdGUoQ21pbl9sb2FkID0gZmFjdG9yKENtaW5fbG9hZCwgbGV2ZWxzPSBjKCJMb3ciLCAiSGlnaCIpKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IENtaW5fbG9hZCwgeSA9IG9ic2VydmVkX2ZlYXR1cmVzLCBzaGFwZSA9IFNleCwgY29sb3IgPSBDbWluX2xvYWQpKSArIAogIGdlb21fcXVhc2lyYW5kb20oYWxwaGEgPSAwLjcsIHNpemUgPSAwLjc1KSArCiAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaXplPTIsIGFlcyhncm91cCA9IENtaW5fbG9hZCksIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjYsIHNoYXBlID0gMTUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JfSEwsIGxhYmVsID0gYygiS2lsbGVkLUNNIiwgIkxpdmUtQ00iKSwgbmFtZSA9ICJUcmVhdG1lbnQiKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IHNoYXBlX1NleCwgbGFiZWwgPSBjKCJGZW1hbGUiLCAiTWFsZSIpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiTG93IiA9ICJMb3dcbkNNIiwgIkhpZ2giID0gIkhpZ2hcbkNNIikpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDEwKSArCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICBsYWJzKHkgPSAiIyBtaWNyb2JpYWwgc3BlY2llcyIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKSAKRmlnUzdfYWxwaGFfSExfTVIKCkZpZ1M3X2FscGhhX0hMX1NFIDwtIEFscGhhX2Rpdl9ITCAlPiUgCiAgZHJvcF9uYShDbWluX2xvYWQpICU+JSAKICBkcGx5cjo6bXV0YXRlKENtaW5fbG9hZCA9IGZhY3RvcihDbWluX2xvYWQsIGxldmVscz0gYygiTG93IiwgIkhpZ2giKSkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBDbWluX2xvYWQsIHkgPSBzaGFubm9uX2VudHJvcHksIHNoYXBlID0gU2V4LCBjb2xvciA9IENtaW5fbG9hZCkpICsgCiAgZ2VvbV9xdWFzaXJhbmRvbShhbHBoYSA9IDAuNywgc2l6ZSA9IDAuNzUpICsKICBzdGF0X3N1bW1hcnkoZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNpemU9MiwgYWVzKGdyb3VwID0gQ21pbl9sb2FkKSwgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNiwgc2hhcGUgPSAxNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9ITCwgbGFiZWwgPSBjKCJLaWxsZWQtQ00iLCAiTGl2ZS1DTSIpLCBuYW1lID0gIlRyZWF0bWVudCIpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gc2hhcGVfU2V4LCBsYWJlbCA9IGMoIkZlbWFsZSIsICJNYWxlIikpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJMb3ciID0gIkxvd1xuQ00iLCAiSGlnaCIgPSAiSGlnaFxuQ00iKSkgKwogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTApICsKICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIGxhYnMoeSA9ICJTaGFubm9uIEVudHJvcHkiKSsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKSAKRmlnUzdfYWxwaGFfSExfU0UKCkZpZ1M3X2FscGhhX0hMX0ZQRCA8LSBBbHBoYV9kaXZfSEwgJT4lIAogIGRyb3BfbmEoQ21pbl9sb2FkKSAlPiUgCiAgZHBseXI6Om11dGF0ZShDbWluX2xvYWQgPSBmYWN0b3IoQ21pbl9sb2FkLCBsZXZlbHM9IGMoIkxvdyIsICJIaWdoIikpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gQ21pbl9sb2FkLCB5ID0gZmFpdGhfcGQsIHNoYXBlID0gU2V4LCBjb2xvciA9IENtaW5fbG9hZCkpICsgCiAgZ2VvbV9xdWFzaXJhbmRvbShhbHBoYSA9IDAuNywgc2l6ZSA9IDAuNzUpICsKICBzdGF0X3N1bW1hcnkoZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNpemU9MiwgYWVzKGdyb3VwID0gQ21pbl9sb2FkKSwgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNiwgc2hhcGUgPSAxNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9ITCwgbGFiZWwgPSBjKCJLaWxsZWQtQ00iLCAiTGl2ZS1DTSIpLCBuYW1lID0gIlRyZWF0bWVudCIpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gc2hhcGVfU2V4LCBsYWJlbCA9IGMoIkZlbWFsZSIsICJNYWxlIikpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJMb3ciID0gIkxvd1xuQ00iLCAiSGlnaCIgPSAiSGlnaFxuQ00iKSkgKwogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTApICsKICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIGxhYnMoeSA9ICJGYWl0aCdzIFBEIikrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSkgCkZpZ1M3X2FscGhhX0hMX0ZQRAoKRmlnUzdfYWxwaGFfSExfUEUgPC0gQWxwaGFfZGl2X0hMICU+JSAKICBkcm9wX25hKENtaW5fbG9hZCkgJT4lIAogIGRwbHlyOjptdXRhdGUoQ21pbl9sb2FkID0gZmFjdG9yKENtaW5fbG9hZCwgbGV2ZWxzPSBjKCJMb3ciLCAiSGlnaCIpKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IENtaW5fbG9hZCwgeSA9IHBpZWxvdV9ldmVubmVzcywgc2hhcGUgPSBTZXgsIGNvbG9yID0gQ21pbl9sb2FkKSkgKyAKICBnZW9tX3F1YXNpcmFuZG9tKGFscGhhID0gMC43LCBzaXplID0gMC43NSkgKwogIHN0YXRfc3VtbWFyeShmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2l6ZT0yLCBhZXMoZ3JvdXAgPSBDbWluX2xvYWQpLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC42LCBzaGFwZSA9IDE1KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX0hMLCBsYWJlbCA9IGMoIktpbGxlZC1DTSIsICJMaXZlLUNNIiksIG5hbWUgPSAiVHJlYXRtZW50IikgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBzaGFwZV9TZXgsIGxhYmVsID0gYygiRmVtYWxlIiwgIk1hbGUiKSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIkxvdyIgPSAiTG93XG5DTSIsICJIaWdoIiA9ICJIaWdoXG5DTSIpKSArCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxMCkgKwogIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgbGFicyh5ID0gIlBpbG91IGV2ZW5uZXNzIikrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSkgCkZpZ1M3X2FscGhhX0hMX1BFCmBgYApiZXRhIGRpdmVyc2l0eQpgYGB7cn0KcmVhZHNfcmFyZV9ub3JtX21ldGFkYXRhIDwtIHJlYWRzX3JhcmVfbm9ybV9tZXRhZGF0YVsgb3JkZXIocm93Lm5hbWVzKHJlYWRzX3JhcmVfbm9ybV9tZXRhZGF0YSkpLCBdIAoKbWV0YWRhdGFfQ21pbl9sb2FkIDwtIG1ldGFkYXRhX0NtaW5fSEwgJT4lCiAgZHBseXI6OnNlbGVjdChNb3VzZUlELCBDbWluX2xvYWQpCgpyZWFkc19yYXJlX25vcm1fbWV0YWRhdGEubWVsdF9ITCA8LSByZWFkc19yYXJlX25vcm1fbWV0YWRhdGEgJT4lIAogIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJzYW1wbGVpZCIpICAlPiUKICBkcGx5cjo6bGVmdF9qb2luKG1ldGFkYXRhX0NtaW5fbG9hZCwgYnkgPSJNb3VzZUlEIikgJT4lCiAgZHBseXI6OnNlbGVjdChzYW1wbGVpZCwgU2V4LCBDbWluX2xvYWQpICU+JQogIGRwbHlyOjptdXRhdGVfaWYoaXMuZmFjdG9yLGFzLmNoYXJhY3RlcikKCndVRl9tZWx0X0hMIDwtIG1lbHQoYXMubWF0cml4KEJldGFfd1VGLjIpKSAlPiUKICAgIGZpbHRlcihhcy5jaGFyYWN0ZXIoVmFyMSkgIT0gYXMuY2hhcmFjdGVyKFZhcjIpKSAlPiUKICAgIG11dGF0ZV9pZihpcy5mYWN0b3IsYXMuY2hhcmFjdGVyKQoKdXdVRl9tZWx0X0hMIDwtIG1lbHQoYXMubWF0cml4KEJldGFfdXdVRi4yKSkgJT4lCiAgICBmaWx0ZXIoYXMuY2hhcmFjdGVyKFZhcjEpICE9IGFzLmNoYXJhY3RlcihWYXIyKSkgJT4lCiAgICBtdXRhdGVfaWYoaXMuZmFjdG9yLGFzLmNoYXJhY3RlcikKCmNvbG5hbWVzKHJlYWRzX3JhcmVfbm9ybV9tZXRhZGF0YS5tZWx0X0hMKSA9IGMoIlZhcjEiLCAiU2V4MSIsICJDbWluX2xvYWQxIikKd1VGX21lbHRfSEwgPSBsZWZ0X2pvaW4od1VGX21lbHRfSEwsIHJlYWRzX3JhcmVfbm9ybV9tZXRhZGF0YS5tZWx0X0hMLCBieSA9ICJWYXIxIikKdXdVRl9tZWx0X0hMID0gbGVmdF9qb2luKHV3VUZfbWVsdF9ITCwgcmVhZHNfcmFyZV9ub3JtX21ldGFkYXRhLm1lbHRfSEwsIGJ5ID0gIlZhcjEiKQoKY29sbmFtZXMocmVhZHNfcmFyZV9ub3JtX21ldGFkYXRhLm1lbHRfSEwpID0gYygiVmFyMiIsICJTZXgyIiwgIkNtaW5fbG9hZDIiKQp3VUZfbWVsdF9ITCA9IGxlZnRfam9pbih3VUZfbWVsdF9ITCwgcmVhZHNfcmFyZV9ub3JtX21ldGFkYXRhLm1lbHRfSEwsIGJ5ID0gIlZhcjIiKQp1d1VGX21lbHRfSEwgPSBsZWZ0X2pvaW4odXdVRl9tZWx0X0hMLCByZWFkc19yYXJlX25vcm1fbWV0YWRhdGEubWVsdF9ITCwgYnkgPSAiVmFyMiIpCmBgYApgYGB7cn0Kc2V0LnNlZWQoNzY1KQoKd1VGX21lbHQuSEwgPC0gd1VGX21lbHRfSEwgJT4lCiAgZHBseXI6OmZpbHRlcihDbWluX2xvYWQxID09IENtaW5fbG9hZDIsIFNleDEgPT0gU2V4MikgJT4lCiAgZHBseXI6Om11dGF0ZShDbWluX2xvYWQgPSBDbWluX2xvYWQxLCBTZXggPSBTZXgxKQoKd2lsY294LnRlc3QodmFsdWUgfiBDbWluX2xvYWQsIGRhdGEgPSB3VUZfbWVsdC5ITCwgZXhhY3QgPSBGQUxTRSwgY29ycmVjdCA9IEZBTFNFKQoKCnV3VUZfbWVsdC5ITCA8LSB1d1VGX21lbHRfSEwgJT4lCiAgZHBseXI6OmZpbHRlcihDbWluX2xvYWQxID09IENtaW5fbG9hZDIsIFNleDEgPT0gU2V4MikgJT4lCiAgZHBseXI6Om11dGF0ZShDbWluX2xvYWQgPSBDbWluX2xvYWQxLCBTZXggPSBTZXgxKSAKCndpbGNveC50ZXN0KHZhbHVlIH4gQ21pbl9sb2FkLCBkYXRhID0gdXdVRl9tZWx0LkhMLCBleGFjdCA9IEZBTFNFLCBjb3JyZWN0ID0gRkFMU0UpIApgYGAKYGBge3J9CkZpZ1M3X3dVRiA8LSB3VUZfbWVsdC5ITCAlPiUKICBkcm9wX25hKENtaW5fbG9hZCkgJT4lCiAgZHBseXI6Om11dGF0ZShDbWluX2xvYWQgPSBmYWN0b3IoQ21pbl9sb2FkLCBsZXZlbHM9IGMoIkxvdyIsICJIaWdoIikpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gQ21pbl9sb2FkLCB5ID0gdmFsdWUsIGZpbGw9ZmFjdG9yKENtaW5fbG9hZCkpKSArCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxMCkgKwogIGdlb21fYm94cGxvdChhbHBoYSA9MC43LCBvdXRsaWVyLnNpemUgPSAwLjMsIG91dGxpZXIuYWxwaGEgPSAwLjUpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9Y29sb3JfSEwpKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIkxvdyIgPSAiTG93XG5DTSIsICJIaWdoIiA9ICJIaWdoXG5DTSIpKSArCiAgbGFicyh5ID0gIndlaWdodGVkXG5VbmlGcmFjIGRpc3RhbmNlcyIpICArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSwgYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSkgCkZpZ1M3X3dVRgoKRmlnUzdfdXdVRiA8LXV3VUZfbWVsdC5ITCAlPiUKICBkcm9wX25hKENtaW5fbG9hZCkgJT4lCiAgZHBseXI6Om11dGF0ZShDbWluX2xvYWQgPSBmYWN0b3IoQ21pbl9sb2FkLCBsZXZlbHM9IGMoIkxvdyIsICJIaWdoIikpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gQ21pbl9sb2FkLCB5ID0gdmFsdWUsIGZpbGw9ZmFjdG9yKENtaW5fbG9hZCkpKSArCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxMCkgKwogIGdlb21fYm94cGxvdChhbHBoYSA9MC43LCBvdXRsaWVyLnNpemUgPSAwLjMsIG91dGxpZXIuYWxwaGEgPSAwLjUpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9Y29sb3JfSEwpKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIkxvdyIgPSAiTG93XG5DTSIsICJIaWdoIiA9ICJIaWdoXG5DTSIpKSArCiAgbGFicyh5ID0gInVud2VpZ2h0ZWRcblVuaUZyYWMgZGlzdGFuY2VzIikgICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpLCBheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpKQpGaWdTN191d1VGCmBgYApgYGB7cn0KRmlnUzdfSExfbGVnZW5kIDwtIGNvd3Bsb3Q6OmdldF9sZWdlbmQobWV0YWRhdGFfQ21pbl9ITCAlPiUgCiAgZHBseXI6Om11dGF0ZShTZXggPSBpZmVsc2UoU2V4ID09ICJGIiwgIkZlbWFsZSIsICJNYWxlIiksIENtaW5fbG9hZCA9IGlmZWxzZShDbWluX2xvYWQgPT0gIkxvdyIsICJMb3ctQ00iLCAiSGlnaC1DTSIpKSAlPiUKICBkcGx5cjo6bXV0YXRlKFNleF9DbWluX2xvYWQgPSBwYXN0ZShTZXgsIENtaW5fbG9hZCwgc2VwID0gIiAiKSkgJT4lCiAgZ2dwbG90KCkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBTZXhfQ21pbl9sb2FkLCB5ID0gcVBDUl9DbWluX3Blcl9nQ0MsIHNoYXBlID0gU2V4X0NtaW5fbG9hZCwgY29sb3IgPSBTZXhfQ21pbl9sb2FkKSwgc2l6ZSA9MyAsIGFscGhhID0xLAogICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBUKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1jKDE2LCAxNiw0LCA0KSkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPSBjKGNvbG9yX0hMLCBjb2xvcl9ITCkpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDEwKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSkKCkZpZ1M3X2FsaWduIDwtIGNvd3Bsb3Q6OmFsaWduX3Bsb3RzKEZpZ1M3X21iaW9tYXNzX0hMICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlnUzdfYmlvbWFzc19iYyArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZ1M3X2NtaW5fYmMgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWdTN19hbHBoYV9ITF9NUiArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZ1M3X2FscGhhX0hMX1NFICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlnUzdfYWxwaGFfSExfRlBEICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlnUzdfYWxwaGFfSExfUEUgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWdTN193VUYgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWdTN191d1VGICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSAnaHYnLCBheGlzID0gJ3RibHInKQoKRmlnUzdfMSA8LSBjb3dwbG90OjpwbG90X2dyaWQoRmlnUzdfYWxpZ25bWzFdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlnUzdfYWxpZ25bWzJdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZ1M3X2FsaWduW1szXV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWdTN19hbGlnbltbNF1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWdTN19hbGlnbltbNl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWdTN19hbGlnbltbNV1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWdTN19hbGlnbltbN11dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWdTN19hbGlnbltbOF1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWdTN19hbGlnbltbOV1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sPTMsIG5yb3c9MywgbGFiZWxzID0gYygiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIsICJIIiwgIkkiKSwgbGFiZWxfc2l6ZSA9IDEyLCByZWxfd2lkdGhzID0gYygxLDEsIDEpKQoKRmlndXJlUzcgPC0gY293cGxvdDo6cGxvdF9ncmlkKEZpZ1M3XzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZ1M3X0hMX2xlZ2VuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbD0xLCBucm93PTIsICByZWxfaGVpZ2h0cyA9IGMoMywgMC4wNSkpCmBgYApgYGB7ciBmaWcud2lkdGg9Ni41LCBmaWcuaGVpZ2h0PSA1LjV9CkZpZ3VyZVM3CmBgYApgYGB7ciBldmFsID0gRkFMU0V9Cmdnc2F2ZSgiLi9GaWd1cmVTNy5wZGYiLCBwbG90ID0gRmlndXJlUzcsIGRldmljZSA9IGNhaXJvX3BkZiwgIAogIHdpZHRoID0gMTYuNSwKICBoZWlnaHQgPSAxNCwKICB1bml0cyA9ICJjbSIpCmBgYAoKYGBge3J9CnNlc3Npb25JbmZvKCkKYGBg